Files
grafana/packages/grafana-data/src/vector/FunctionalVector.ts
T
Josh Hunt 3c6e0e8ef8 Chore: ESlint import order (#44959)
* Add and configure eslint-plugin-import

* Fix the lint:ts npm command

* Autofix + prettier all the files

* Manually fix remaining files

* Move jquery code in jest-setup to external file to safely reorder imports

* Resolve issue caused by circular dependencies within Prometheus

* Update .betterer.results

* Fix missing // @ts-ignore

* ignore iconBundle.ts

* Fix missing // @ts-ignore
2022-04-22 14:33:13 +01:00

81 lines
1.7 KiB
TypeScript

import { Vector } from '../types';
import { vectorToArray } from './vectorToArray';
/** @public */
export abstract class FunctionalVector<T = any> implements Vector<T>, Iterable<T> {
abstract get length(): number;
abstract get(index: number): T;
// Implement "iterator protocol"
*iterator() {
for (let i = 0; i < this.length; i++) {
yield this.get(i);
}
}
// Implement "iterable protocol"
[Symbol.iterator]() {
return this.iterator();
}
forEach(iterator: (row: T) => void) {
return vectorator(this).forEach(iterator);
}
map<V>(transform: (item: T, index: number) => V) {
return vectorator(this).map(transform);
}
filter(predicate: (item: T) => boolean): T[] {
return vectorator(this).filter(predicate);
}
toArray(): T[] {
return vectorToArray(this);
}
toJSON(): any {
return this.toArray();
}
}
/**
* Use functional programming with your vector
*/
export function vectorator<T>(vector: Vector<T>) {
return {
*[Symbol.iterator]() {
for (let i = 0; i < vector.length; i++) {
yield vector.get(i);
}
},
forEach(iterator: (row: T) => void) {
for (let i = 0; i < vector.length; i++) {
iterator(vector.get(i));
}
},
map<V>(transform: (item: T, index: number) => V) {
const result: V[] = [];
for (let i = 0; i < vector.length; i++) {
result.push(transform(vector.get(i), i));
}
return result;
},
/** Add a predicate where you return true if it should *keep* the value */
filter(predicate: (item: T) => boolean): T[] {
const result: T[] = [];
for (const val of this) {
if (predicate(val)) {
result.push(val);
}
}
return result;
},
};
}