You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
2.8 KiB
111 lines
2.8 KiB
1 month ago
|
var Entry = (function () {
|
||
|
function Entry(val) {
|
||
|
this.value = val;
|
||
|
}
|
||
|
return Entry;
|
||
|
}());
|
||
|
export { Entry };
|
||
|
var LinkedList = (function () {
|
||
|
function LinkedList() {
|
||
|
this._len = 0;
|
||
|
}
|
||
|
LinkedList.prototype.insert = function (val) {
|
||
|
var entry = new Entry(val);
|
||
|
this.insertEntry(entry);
|
||
|
return entry;
|
||
|
};
|
||
|
LinkedList.prototype.insertEntry = function (entry) {
|
||
|
if (!this.head) {
|
||
|
this.head = this.tail = entry;
|
||
|
}
|
||
|
else {
|
||
|
this.tail.next = entry;
|
||
|
entry.prev = this.tail;
|
||
|
entry.next = null;
|
||
|
this.tail = entry;
|
||
|
}
|
||
|
this._len++;
|
||
|
};
|
||
|
LinkedList.prototype.remove = function (entry) {
|
||
|
var prev = entry.prev;
|
||
|
var next = entry.next;
|
||
|
if (prev) {
|
||
|
prev.next = next;
|
||
|
}
|
||
|
else {
|
||
|
this.head = next;
|
||
|
}
|
||
|
if (next) {
|
||
|
next.prev = prev;
|
||
|
}
|
||
|
else {
|
||
|
this.tail = prev;
|
||
|
}
|
||
|
entry.next = entry.prev = null;
|
||
|
this._len--;
|
||
|
};
|
||
|
LinkedList.prototype.len = function () {
|
||
|
return this._len;
|
||
|
};
|
||
|
LinkedList.prototype.clear = function () {
|
||
|
this.head = this.tail = null;
|
||
|
this._len = 0;
|
||
|
};
|
||
|
return LinkedList;
|
||
|
}());
|
||
|
export { LinkedList };
|
||
|
var LRU = (function () {
|
||
|
function LRU(maxSize) {
|
||
|
this._list = new LinkedList();
|
||
|
this._maxSize = 10;
|
||
|
this._map = {};
|
||
|
this._maxSize = maxSize;
|
||
|
}
|
||
|
LRU.prototype.put = function (key, value) {
|
||
|
var list = this._list;
|
||
|
var map = this._map;
|
||
|
var removed = null;
|
||
|
if (map[key] == null) {
|
||
|
var len = list.len();
|
||
|
var entry = this._lastRemovedEntry;
|
||
|
if (len >= this._maxSize && len > 0) {
|
||
|
var leastUsedEntry = list.head;
|
||
|
list.remove(leastUsedEntry);
|
||
|
delete map[leastUsedEntry.key];
|
||
|
removed = leastUsedEntry.value;
|
||
|
this._lastRemovedEntry = leastUsedEntry;
|
||
|
}
|
||
|
if (entry) {
|
||
|
entry.value = value;
|
||
|
}
|
||
|
else {
|
||
|
entry = new Entry(value);
|
||
|
}
|
||
|
entry.key = key;
|
||
|
list.insertEntry(entry);
|
||
|
map[key] = entry;
|
||
|
}
|
||
|
return removed;
|
||
|
};
|
||
|
LRU.prototype.get = function (key) {
|
||
|
var entry = this._map[key];
|
||
|
var list = this._list;
|
||
|
if (entry != null) {
|
||
|
if (entry !== list.tail) {
|
||
|
list.remove(entry);
|
||
|
list.insertEntry(entry);
|
||
|
}
|
||
|
return entry.value;
|
||
|
}
|
||
|
};
|
||
|
LRU.prototype.clear = function () {
|
||
|
this._list.clear();
|
||
|
this._map = {};
|
||
|
};
|
||
|
LRU.prototype.len = function () {
|
||
|
return this._list.len();
|
||
|
};
|
||
|
return LRU;
|
||
|
}());
|
||
|
export default LRU;
|