import LinkedList from './LinkedList'; /** * LRU Cache * @constructor * @alias clay.core.LRU */ var LRU = function (maxSize) { this._list = new LinkedList(); this._map = {}; this._maxSize = maxSize || 10; }; /** * Set cache max size * @param {number} size */ LRU.prototype.setMaxSize = function (size) { this._maxSize = size; }; /** * @param {string} key * @param {} value */ LRU.prototype.put = function (key, value) { if (!this._map.hasOwnProperty(key)) { var len = this._list.length(); if (len >= this._maxSize && len > 0) { // Remove the least recently used var leastUsedEntry = this._list.head; this._list.remove(leastUsedEntry); delete this._map[leastUsedEntry.key]; } var entry = this._list.insert(value); entry.key = key; this._map[key] = entry; } }; /** * @param {string} key * @return {} */ LRU.prototype.get = function (key) { var entry = this._map[key]; if (this._map.hasOwnProperty(key)) { // Put the latest used entry in the tail if (entry !== this._list.tail) { this._list.remove(entry); this._list.insertEntry(entry); } return entry.value; } }; /** * @param {string} key */ LRU.prototype.remove = function (key) { var entry = this._map[key]; if (typeof(entry) !== 'undefined') { delete this._map[key]; this._list.remove(entry); } }; /** * Clear the cache */ LRU.prototype.clear = function () { this._list.clear(); this._map = {}; }; export default LRU;