Files
qmk-keymap-generator/lib/Row.ts

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;