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;