import type { Timed } from './types'; import ListWalker from './ListWalker'; type CheckFn = (t: T) => boolean; export default class ListWalkerWithMarks< T extends Timed, > extends ListWalker { private _markCountNow: number = 0; private _markCount: number = 0; constructor( private isMarked: CheckFn, initialList: T[] = [], ) { super(initialList); this._markCount = initialList.reduce( (n, item) => (isMarked(item) ? n + 1 : n), 0, ); } append(item: T) { if (this.isMarked(item)) { this._markCount++; } super.append(item); } protected moveNext() { const val = super.moveNext(); if (val && this.isMarked(val)) { this._markCountNow++; } return val; } protected movePrev() { const val = super.movePrev(); if (val && this.isMarked(val)) { this._markCountNow--; } return val; } get markedCountNow(): number { return this._markCountNow; } get markedCount(): number { return this._markCount; } }