62 lines
4.4 KiB
JavaScript
62 lines
4.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.LRU = void 0;
|
|
class Node {
|
|
constructor(key, value, next, prev) {
|
|
this.key = key;
|
|
this.value = value;
|
|
this.next = next;
|
|
this.prev = prev;
|
|
}
|
|
}
|
|
class LRU {
|
|
constructor(limit, size = 0) {
|
|
this.limit = limit;
|
|
this.size = size;
|
|
this.cache = {};
|
|
this.head = new Node('HEAD', null, null, null);
|
|
this.tail = new Node('TAIL', null, null, null);
|
|
this.head.next = this.tail;
|
|
this.tail.prev = this.head;
|
|
}
|
|
write(key, value) {
|
|
if (this.cache[key]) {
|
|
this.cache[key].value = value;
|
|
}
|
|
else {
|
|
const node = new Node(key, value, this.head.next, this.head);
|
|
this.head.next.prev = node;
|
|
this.head.next = node;
|
|
this.cache[key] = node;
|
|
this.size++;
|
|
this.ensureLimit();
|
|
}
|
|
}
|
|
read(key) {
|
|
if (!this.cache[key])
|
|
return;
|
|
const { value } = this.cache[key];
|
|
this.remove(key);
|
|
this.write(key, value);
|
|
return value;
|
|
}
|
|
remove(key) {
|
|
const node = this.cache[key];
|
|
node.prev.next = node.next;
|
|
node.next.prev = node.prev;
|
|
delete this.cache[key];
|
|
this.size--;
|
|
}
|
|
clear() {
|
|
this.head.next = this.tail;
|
|
this.tail.prev = this.head;
|
|
this.size = 0;
|
|
this.cache = {};
|
|
}
|
|
ensureLimit() {
|
|
if (this.size > this.limit)
|
|
this.remove(this.tail.prev.key);
|
|
}
|
|
}
|
|
exports.LRU = LRU;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJ1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpcXVpZGpzL2NhY2hlL2xydS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxNQUFNLElBQUk7SUFDUixZQUNTLEdBQVcsRUFDWCxLQUFRLEVBQ1IsSUFBYSxFQUNiLElBQWE7UUFIYixRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQ1gsVUFBSyxHQUFMLEtBQUssQ0FBRztRQUNSLFNBQUksR0FBSixJQUFJLENBQVM7UUFDYixTQUFJLEdBQUosSUFBSSxDQUFTO0lBQ25CLENBQUM7Q0FDTDtBQUVELE1BQWEsR0FBRztJQUtkLFlBQ1MsS0FBYSxFQUNiLE9BQU8sQ0FBQztRQURSLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixTQUFJLEdBQUosSUFBSSxDQUFJO1FBTlQsVUFBSyxHQUErQixFQUFFLENBQUE7UUFRNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBSSxNQUFNLEVBQUUsSUFBVyxFQUFFLElBQVcsRUFBRSxJQUFXLENBQUMsQ0FBQTtRQUN0RSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFJLE1BQU0sRUFBRSxJQUFXLEVBQUUsSUFBVyxFQUFFLElBQVcsQ0FBQyxDQUFBO1FBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFFLEdBQVcsRUFBRSxLQUFRO1FBQzFCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7U0FDOUI7YUFBTTtZQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1lBRXJCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFBO1lBQ3RCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUNYLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtTQUNuQjtJQUNILENBQUM7SUFFRCxJQUFJLENBQUUsR0FBVztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU07UUFDNUIsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN0QixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxNQUFNLENBQUUsR0FBVztRQUNqQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtRQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ2IsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUE7UUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTtJQUNqQixDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUs7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzdELENBQUM7Q0FDRjtBQXZERCxrQkF1REMifQ==
|