74 lines
1.6 KiB
TypeScript
74 lines
1.6 KiB
TypeScript
import { IKey, IKeys } from './keys';
|
|
|
|
export interface IKeyRow extends IterableIterator<IKey> {
|
|
keys: IKeys;
|
|
index: number;
|
|
length: number;
|
|
forEach(fn: (k: IKey, i: number) => any): void;
|
|
map(fn: (k: IKey, i: number) => IKey): IKeys;
|
|
replace(keys: { [name: string]: IKey | IKeys }): IKeyRow;
|
|
}
|
|
|
|
export class KeyRow implements IKeyRow {
|
|
keys: IKeys = [];
|
|
index: number = 0;
|
|
|
|
constructor(keys: IKeys) {
|
|
this.keys = keys;
|
|
this.index = 0;
|
|
}
|
|
|
|
forEach(fn: (k: IKey, i: number) => any): void {
|
|
return this.keys.forEach(fn);
|
|
}
|
|
|
|
map(fn: (k: IKey, i: number) => IKey): IKeys {
|
|
return this.keys.map(fn);
|
|
}
|
|
|
|
get length(): number {
|
|
return this.keys.length;
|
|
}
|
|
|
|
replace(keys: { [name: string]: IKey | IKeys }): IKeyRow {
|
|
const updatedKeys: IKeys = [];
|
|
for (let i: number = 0; i < this.keys.length; i++) {
|
|
const key: IKey | IKeys = this.keys[i];
|
|
|
|
if (key && keys[key]) {
|
|
if (keys[key] instanceof Array) {
|
|
(<IKeys>keys[key]).forEach((k) => updatedKeys.push(k));
|
|
} else {
|
|
updatedKeys.push(<IKey>keys[key]);
|
|
}
|
|
} else {
|
|
updatedKeys.push(key);
|
|
}
|
|
}
|
|
this.keys = updatedKeys;
|
|
return this;
|
|
}
|
|
|
|
public next(): IteratorResult<IKey> {
|
|
if (this.index < this.keys.length) {
|
|
return {
|
|
done: false,
|
|
value: this.keys[this.index++],
|
|
};
|
|
}
|
|
return {
|
|
done: true,
|
|
value: null,
|
|
};
|
|
}
|
|
|
|
[Symbol.iterator](): IterableIterator<IKey> {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
export type IKeyRows = IKeyRow[];
|
|
|
|
export const row = (...keys: IKeys): IKeyRow => new KeyRow(keys);
|
|
export default row;
|