36 lines
731 B
TypeScript
36 lines
731 B
TypeScript
// a Map that forgets the least recently used entries past max_size
|
|
export class LruMap<K, V> {
|
|
#map = new Map<K, V>();
|
|
readonly max_size: number;
|
|
|
|
constructor(max_size: number) {
|
|
this.max_size = max_size;
|
|
}
|
|
|
|
get(key: K): V | undefined {
|
|
const value = this.#map.get(key);
|
|
if (value !== undefined) {
|
|
// maps keep insertion order, so re-inserting moves it to the back
|
|
this.#map.delete(key);
|
|
this.#map.set(key, value);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
set(key: K, value: V) {
|
|
this.#map.delete(key);
|
|
this.#map.set(key, value);
|
|
if (this.#map.size > this.max_size) {
|
|
this.#map.delete(this.#map.keys().next().value!);
|
|
}
|
|
}
|
|
|
|
delete(key: K) {
|
|
this.#map.delete(key);
|
|
}
|
|
|
|
get size() {
|
|
return this.#map.size;
|
|
}
|
|
}
|