next
Version:
The React Framework
100 lines (99 loc) • 2.58 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "LRUCache", {
enumerable: true,
get: function() {
return LRUCache;
}
});
class LRUCache {
constructor(maxSize, calculateSize){
this.cache = new Map();
this.sizes = new Map();
this.totalSize = 0;
this.maxSize = maxSize;
this.calculateSize = calculateSize || (()=>1);
}
set(key, value) {
if (!key || !value) return;
const size = this.calculateSize(value);
if (size > this.maxSize) {
console.warn('Single item size exceeds maxSize');
return;
}
if (this.cache.has(key)) {
this.totalSize -= this.sizes.get(key) || 0;
}
this.cache.set(key, value);
this.sizes.set(key, size);
this.totalSize += size;
this.touch(key);
}
has(key) {
if (!key) return false;
this.touch(key);
return Boolean(this.cache.get(key));
}
get(key) {
if (!key) return;
const value = this.cache.get(key);
if (value === undefined) {
return undefined;
}
this.touch(key);
return value;
}
touch(key) {
const value = this.cache.get(key);
if (value !== undefined) {
this.cache.delete(key);
this.cache.set(key, value);
this.evictIfNecessary();
}
}
evictIfNecessary() {
while(this.totalSize > this.maxSize && this.cache.size > 0){
this.evictLeastRecentlyUsed();
}
}
evictLeastRecentlyUsed() {
const lruKey = this.cache.keys().next().value;
if (lruKey !== undefined) {
const lruSize = this.sizes.get(lruKey) || 0;
this.totalSize -= lruSize;
this.cache.delete(lruKey);
this.sizes.delete(lruKey);
}
}
reset() {
this.cache.clear();
this.sizes.clear();
this.totalSize = 0;
}
keys() {
return [
...this.cache.keys()
];
}
remove(key) {
if (this.cache.has(key)) {
this.totalSize -= this.sizes.get(key) || 0;
this.cache.delete(key);
this.sizes.delete(key);
}
}
clear() {
this.cache.clear();
this.sizes.clear();
this.totalSize = 0;
}
get size() {
return this.cache.size;
}
get currentSize() {
return this.totalSize;
}
}
//# sourceMappingURL=lru-cache.js.map