UNPKG

@thermopylae/lib.cache

Version:
54 lines (53 loc) 1.77 kB
import { createException } from "../../error.js"; import { OrderedBucketList } from "../../data-structures/bucket-list/ordered-bucket-list.js"; const IGNORED_BUCKET_ID = -1; class BaseLFUEvictionPolicy { frequencies; cacheMaxCapacity; cacheBackendElementsCount; deleteFromCache; 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.frequencies = new OrderedBucketList(); } get size() { return this.frequencies.size; } onHit(entry) { const oldFrequency = OrderedBucketList.getBucketId(entry); const newFrequency = this.computeEntryFrequency(entry, oldFrequency); this.frequencies.move(IGNORED_BUCKET_ID, newFrequency, entry); return 1 ; } onMiss() { return undefined; } onSet(entry) { if (this.cacheBackendElementsCount.size > this.cacheMaxCapacity) { this.evict(); } this.frequencies.add(this.initialFrequency, entry); } onUpdate(_entry) { return undefined; } onDelete(entry) { this.frequencies.remove(IGNORED_BUCKET_ID, entry); } onClear() { this.frequencies.clear(); } setDeleter(deleter) { this.deleteFromCache = deleter; } evict() { const currentFreqListHead = this.frequencies.head; this.deleteFromCache(currentFreqListHead.bucket.tail); this.onEvict(currentFreqListHead.id); } } export { BaseLFUEvictionPolicy };