@thermopylae/lib.cache
Version:
43 lines (42 loc) • 1.29 kB
JavaScript
import { DoublyLinkedList } from "../../data-structures/list/doubly-linked.js";
import { createException } from "../../error.js";
class LRUEvictionPolicy {
cacheMaxCapacity;
cacheBackendElementsCount;
deleteFromCache;
usageRecency;
constructor(cacheMaxCapacity, cacheBackendElementsCount) {
if (cacheMaxCapacity <= 0) {
throw createException("INVALID_CACHE_MAX_CAPACITY" , `Capacity needs to be greater than 0. Given: ${cacheMaxCapacity}.`);
}
this.cacheMaxCapacity = cacheMaxCapacity;
this.cacheBackendElementsCount = cacheBackendElementsCount;
this.usageRecency = new DoublyLinkedList();
}
onHit(entry) {
this.usageRecency.toFront(entry);
return 1 ;
}
onMiss() {
return undefined;
}
onSet(entry) {
if (this.cacheBackendElementsCount.size > this.cacheMaxCapacity) {
this.deleteFromCache(this.usageRecency.tail);
}
this.usageRecency.unshift(entry);
}
onUpdate() {
return undefined;
}
onDelete(entry) {
this.usageRecency.remove(entry);
}
onClear() {
this.usageRecency.clear();
}
setDeleter(deleter) {
this.deleteFromCache = deleter;
}
}
export { LRUEvictionPolicy };