Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | 1x 1x 10x 10x 10x 10x 10x 10x 10x 10x 26x 26x 26x 3x 3x 23x 14x 5x 15x 15x 15x 15x 14x 15x 14x 14x 14x 15x 1x | /**
* TimedState works similar to TimedQueue, but instead of saving
* a list of all items pushed, it reduces the state on each push.
*/
export class TimedState<S, I> {
/**
* State will be flushed when it reaches this number of items.
*/
public itemLimit: number = 100;
/**
* State will be flushed after this many milliseconds.
*/
public timeLimit: number = 5_000;
/**
* Method that will be called when state is flushed.
*/
public onFlush: (state: S) => void = () => {};
constructor(
protected readonly initState: () => S,
protected readonly reducer: (state: S, item: I) => S,
) {}
protected length: number = 0;
protected state: S = this.initState();
private timer: any = null;
push(item: I): void {
this.length++;
this.state = this.reducer(this.state, item);
if (this.length >= this.itemLimit) {
this.flush();
return;
}
if (!this.timer) {
this.timer = setTimeout(() => {
this.flush();
}, this.timeLimit);
}
}
flush(): S {
const {state, length} = this;
this.state = this.initState();
this.length = 0;
if (this.timer) clearTimeout(this.timer);
if (length) {
this.timer = null;
try {
this.onFlush(state);
} catch (error) {
// tslint:disable-next-line
console.error('TimedState', error);
}
}
return state;
}
}
|