You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

63 lines
1.5 KiB

export class MRU<T> {
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];
}
}