all files / src/core/ LRU.js

67.74% Statements 21/31
50% Branches 7/14
50% Functions 3/6
67.74% Lines 21/31
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82                30×   30×   30×                           28× 28× 28×             28× 28× 28×               64× 64×   36× 36× 36×     36×                                            
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) {
    Eif (typeof(this._map[key]) == 'undefined') {
        var len = this._list.length();
        Iif (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 (typeof(entry) != 'undefined') {
        // Put the latest used entry in the tail
        Eif (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;