export class MRU { private stack: T[] = []; constructor(public readonly maxSize: number = 10, private readonly comparator?: (a: T, b: T) => boolean) {} get count(): number { return this.stack.length; } private _position: number = 0; get position(): number { return this._position; } add(item: T): void { if (this._position > 0) { this.stack.splice(0, this._position); this._position = 0; } const index = this.comparator != null ? this.stack.findIndex(i => this.comparator!(item, i)) : this.stack.indexOf(item); if (index !== -1) { this.stack.splice(index, 1); } else if (this.stack.length === this.maxSize) { this.stack.pop(); } this.stack.unshift(item); this._position = 0; } get(position?: number): T | undefined { if (position != null) { if (position < 0 || position >= this.stack.length) return undefined; return this.stack[position]; } return this.stack.length > 0 ? this.stack[0] : undefined; } insert(item: T): void { if (this._position > 0) { this.stack.splice(0, this._position); this._position = 0; } this.stack.unshift(item); this._position++; } navigate(direction: 'back' | 'forward'): T | undefined { if (this.stack.length <= 1) return undefined; if (direction === 'back') { if (this._position >= this.stack.length - 1) return undefined; this._position += 1; } else { if (this._position <= 0) return undefined; this._position -= 1; } return this.stack[this._position]; } }