@thermopylae/lib.cache
Version:
83 lines (82 loc) • 2.29 kB
JavaScript
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 };