70 lines
1.4 KiB
Plaintext
70 lines
1.4 KiB
Plaintext
//#region src/lru-cache.ts
|
|
function createLRUCache(max) {
|
|
const cache = /* @__PURE__ */ new Map();
|
|
let oldest;
|
|
let newest;
|
|
const touch = (entry) => {
|
|
if (!entry.next) return;
|
|
if (!entry.prev) {
|
|
entry.next.prev = void 0;
|
|
oldest = entry.next;
|
|
entry.next = void 0;
|
|
if (newest) {
|
|
entry.prev = newest;
|
|
newest.next = entry;
|
|
}
|
|
} else {
|
|
entry.prev.next = entry.next;
|
|
entry.next.prev = entry.prev;
|
|
entry.next = void 0;
|
|
if (newest) {
|
|
newest.next = entry;
|
|
entry.prev = newest;
|
|
}
|
|
}
|
|
newest = entry;
|
|
};
|
|
return {
|
|
get(key) {
|
|
const entry = cache.get(key);
|
|
if (!entry) return void 0;
|
|
touch(entry);
|
|
return entry.value;
|
|
},
|
|
set(key, value) {
|
|
if (cache.size >= max && oldest) {
|
|
const toDelete = oldest;
|
|
cache.delete(toDelete.key);
|
|
if (toDelete.next) {
|
|
oldest = toDelete.next;
|
|
toDelete.next.prev = void 0;
|
|
}
|
|
if (toDelete === newest) newest = void 0;
|
|
}
|
|
const existing = cache.get(key);
|
|
if (existing) {
|
|
existing.value = value;
|
|
touch(existing);
|
|
} else {
|
|
const entry = {
|
|
key,
|
|
value,
|
|
prev: newest
|
|
};
|
|
if (newest) newest.next = entry;
|
|
newest = entry;
|
|
if (!oldest) oldest = entry;
|
|
cache.set(key, entry);
|
|
}
|
|
},
|
|
clear() {
|
|
cache.clear();
|
|
oldest = void 0;
|
|
newest = void 0;
|
|
}
|
|
};
|
|
}
|
|
//#endregion
|
|
export { createLRUCache };
|
|
|
|
//# sourceMappingURL=lru-cache.js.map |