UNPKG

@thermopylae/lib.cache

Version:
83 lines (82 loc) 2.29 kB
import { ArrayObjectPool } from '@thermopylae/lib.pool'; class EntryPoolCacheBackend { store; entryPool; constructor(capacity) { this.store = new Map(); this.entryPool = new ArrayObjectPool({ capacity: capacity ? capacity + 1 : capacity, initializer(entry, args) { entry.key = args[0]; entry.value = args[1]; }, deInitializer(entry) { entry.key = undefined; entry.value = undefined; } }); } get(key) { const objectResource = this.store.get(key); if (objectResource == null) { return undefined; } return objectResource.value; } has(key) { return this.store.has(key); } set(key, value) { const objectResource = this.entryPool.acquire(key, value); this.store.set(key, objectResource); return objectResource.value; } del(entry) { const objectResource = this.store.get(entry.key); this.store.delete(entry.key); this.entryPool.release(objectResource); } clear() { this.store.clear(); this.entryPool.releaseAll(); } get size() { return this.store.size; } [Symbol.iterator]() { return { __iter__: this.store[Symbol.iterator](), next() { const res = this.__iter__.next(); if (res.done) { this.__iter__ = null; return res; } res.value[1] = res.value[1].value; return res; } }; } keys() { return this.store.keys(); } values() { let iter = this.store.values(); return { [Symbol.iterator]() { return { next() { const res = iter.next(); if (res.done) { iter = null; return res; } res.value = res.value.value; return res; } }; } }; } } export { EntryPoolCacheBackend };