lru-cache
Advanced tools
Comparing version 3.2.0 to 4.0.0
@@ -6,27 +6,77 @@ module.exports = LRUCache | ||
var Map = require('pseudomap') | ||
var util = require('util') | ||
// A linked list to keep track of recently-used-ness | ||
var Yallist = require('yallist') | ||
// use symbols if possible, otherwise just _props | ||
var symbols = {} | ||
var hasSymbol = typeof Symbol === 'function' | ||
var makeSymbol | ||
if (hasSymbol) { | ||
makeSymbol = function (key) { | ||
return Symbol.for(key) | ||
} | ||
} else { | ||
makeSymbol = function (key) { | ||
return '_' + key | ||
} | ||
} | ||
function priv (obj, key, val) { | ||
var sym | ||
if (symbols[key]) { | ||
sym = symbols[key] | ||
} else { | ||
sym = makeSymbol(key) | ||
symbols[key] = sym | ||
} | ||
if (arguments.length === 2) { | ||
return obj[sym] | ||
} else { | ||
obj[sym] = val | ||
return val | ||
} | ||
} | ||
function naiveLength () { return 1 } | ||
// lruList is a yallist where the head is the youngest | ||
// item, and the tail is the oldest. the list contains the Hit | ||
// objects as the entries. | ||
// Each Hit object has a reference to its Yallist.Node. This | ||
// never changes. | ||
// | ||
// cache is a Map (or PseudoMap) that matches the keys to | ||
// the Yallist.Node object. | ||
function LRUCache (options) { | ||
if (!(this instanceof LRUCache)) | ||
if (!(this instanceof LRUCache)) { | ||
return new LRUCache(options) | ||
} | ||
if (typeof options === 'number') | ||
if (typeof options === 'number') { | ||
options = { max: options } | ||
} | ||
if (!options) | ||
if (!options) { | ||
options = {} | ||
} | ||
this._max = options.max | ||
var max = priv(this, 'max', options.max) | ||
// Kind of weird to have a default max of Infinity, but oh well. | ||
if (!this._max || !(typeof this._max === "number") || this._max <= 0 ) | ||
this._max = Infinity | ||
if (!max || | ||
!(typeof max === 'number') || | ||
max <= 0) { | ||
priv(this, 'max', Infinity) | ||
} | ||
this._lengthCalculator = options.length || naiveLength | ||
if (typeof this._lengthCalculator !== "function") | ||
this._lengthCalculator = naiveLength | ||
var lc = options.length || naiveLength | ||
if (typeof lc !== 'function') { | ||
lc = naiveLength | ||
} | ||
priv(this, 'lengthCalculator', lc) | ||
this._allowStale = options.stale || false | ||
this._maxAge = options.maxAge || null | ||
this._dispose = options.dispose | ||
priv(this, 'allowStale', options.stale || false) | ||
priv(this, 'maxAge', options.maxAge || 0) | ||
priv(this, 'dispose', options.dispose) | ||
this.reset() | ||
@@ -36,71 +86,84 @@ } | ||
// resize the cache when the max changes. | ||
Object.defineProperty(LRUCache.prototype, "max", | ||
{ set : function (mL) { | ||
if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity | ||
this._max = mL | ||
if (this._length > this._max) trim(this) | ||
Object.defineProperty(LRUCache.prototype, 'max', { | ||
set: function (mL) { | ||
if (!mL || !(typeof mL === 'number') || mL <= 0) { | ||
mL = Infinity | ||
} | ||
, get : function () { return this._max } | ||
, enumerable : true | ||
}) | ||
priv(this, 'max', mL) | ||
trim(this) | ||
}, | ||
get: function () { | ||
return priv(this, 'max') | ||
}, | ||
enumerable: true | ||
}) | ||
// resize the cache when the lengthCalculator changes. | ||
Object.defineProperty(LRUCache.prototype, "lengthCalculator", | ||
{ set : function (lC) { | ||
if (typeof lC !== "function") { | ||
this._lengthCalculator = naiveLength | ||
this._length = this._lruList.size | ||
this._cache.forEach(function (value, key) { | ||
value.length = 1 | ||
}) | ||
} else { | ||
this._lengthCalculator = lC | ||
this._length = 0 | ||
this._cache.forEach(function (value, key) { | ||
value.length = this._lengthCalculator(value.value, key) | ||
this._length += value.length | ||
}, this) | ||
} | ||
Object.defineProperty(LRUCache.prototype, 'allowStale', { | ||
set: function (allowStale) { | ||
priv(this, 'allowStale', !!allowStale) | ||
}, | ||
get: function () { | ||
return priv(this, 'allowStale') | ||
}, | ||
enumerable: true | ||
}) | ||
if (this._length > this._max) trim(this) | ||
Object.defineProperty(LRUCache.prototype, 'maxAge', { | ||
set: function (mA) { | ||
if (!mA || !(typeof mA === 'number') || mA < 0) { | ||
mA = 0 | ||
} | ||
, get : function () { return this._lengthCalculator } | ||
, enumerable : true | ||
}) | ||
priv(this, 'maxAge', mA) | ||
trim(this) | ||
}, | ||
get: function () { | ||
return priv(this, 'maxAge') | ||
}, | ||
enumerable: true | ||
}) | ||
Object.defineProperty(LRUCache.prototype, "length", | ||
{ get : function () { return this._length } | ||
, enumerable : true | ||
}) | ||
// resize the cache when the lengthCalculator changes. | ||
Object.defineProperty(LRUCache.prototype, 'lengthCalculator', { | ||
set: function (lC) { | ||
if (typeof lC !== 'function') { | ||
lC = naiveLength | ||
} | ||
if (lC !== priv(this, 'lengthCalculator')) { | ||
priv(this, 'lengthCalculator', lC) | ||
priv(this, 'length', 0) | ||
priv(this, 'lruList').forEach(function (hit) { | ||
hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key) | ||
priv(this, 'length', priv(this, 'length') + hit.length) | ||
}, this) | ||
} | ||
trim(this) | ||
}, | ||
get: function () { return priv(this, 'lengthCalculator') }, | ||
enumerable: true | ||
}) | ||
Object.defineProperty(LRUCache.prototype, "itemCount", | ||
{ get : function () { return this._lruList.size } | ||
, enumerable : true | ||
}) | ||
Object.defineProperty(LRUCache.prototype, 'length', { | ||
get: function () { return priv(this, 'length') }, | ||
enumerable: true | ||
}) | ||
function reverseKeys (map) { | ||
// keys live in lruList map in insertion order. | ||
// we want them in reverse insertion order. | ||
// flip the list of keys. | ||
var itemCount = map.size | ||
var keys = new Array(itemCount) | ||
var i = itemCount | ||
map.forEach(function (value, key) { | ||
keys[--i] = key | ||
}) | ||
Object.defineProperty(LRUCache.prototype, 'itemCount', { | ||
get: function () { return priv(this, 'lruList').length }, | ||
enumerable: true | ||
}) | ||
return keys | ||
} | ||
LRUCache.prototype.rforEach = function (fn, thisp) { | ||
thisp = thisp || this | ||
this._lruList.forEach(function (hit) { | ||
forEachStep(this, fn, hit, thisp) | ||
}, this) | ||
for (var walker = priv(this, 'lruList').tail; walker !== null;) { | ||
var prev = walker.prev | ||
forEachStep(this, fn, walker, thisp) | ||
walker = prev | ||
} | ||
} | ||
function forEachStep (self, fn, hit, thisp) { | ||
function forEachStep (self, fn, node, thisp) { | ||
var hit = node.value | ||
if (isStale(self, hit)) { | ||
del(self, hit) | ||
if (!self._allowStale) { | ||
del(self, node) | ||
if (!priv(self, 'allowStale')) { | ||
hit = undefined | ||
@@ -114,10 +177,8 @@ } | ||
LRUCache.prototype.forEach = function (fn, thisp) { | ||
thisp = thisp || this | ||
var keys = reverseKeys(this._lruList) | ||
for (var k = 0; k < keys.length; k++) { | ||
var hit = this._lruList.get(keys[k]) | ||
forEachStep(this, fn, hit, thisp) | ||
for (var walker = priv(this, 'lruList').head; walker !== null;) { | ||
var next = walker.next | ||
forEachStep(this, fn, walker, thisp) | ||
walker = next | ||
} | ||
@@ -127,4 +188,4 @@ } | ||
LRUCache.prototype.keys = function () { | ||
return reverseKeys(this._lruList).map(function (k) { | ||
return this._lruList.get(k).key | ||
return priv(this, 'lruList').toArray().map(function (k) { | ||
return k.key | ||
}, this) | ||
@@ -134,4 +195,4 @@ } | ||
LRUCache.prototype.values = function () { | ||
return reverseKeys(this._lruList).map(function (k) { | ||
return this._lruList.get(k).value | ||
return priv(this, 'lruList').toArray().map(function (k) { | ||
return k.value | ||
}, this) | ||
@@ -141,21 +202,17 @@ } | ||
LRUCache.prototype.reset = function () { | ||
if (this._dispose && this._cache) { | ||
this._cache.forEach(function (entry, key) { | ||
this._dispose(key, entry.value) | ||
if (priv(this, 'dispose') && | ||
priv(this, 'lruList') && | ||
priv(this, 'lruList').length) { | ||
priv(this, 'lruList').forEach(function (hit) { | ||
priv(this, 'dispose').call(this, hit.key, hit.value) | ||
}, this) | ||
} | ||
this._cache = new Map() // hash of items by key | ||
this._lruList = new Map() // list of items in order of use recency | ||
this._mru = 0 // most recently used | ||
this._lru = 0 // least recently used | ||
this._length = 0 // number of items in the list | ||
priv(this, 'cache', new Map()) // hash of items by key | ||
priv(this, 'lruList', new Yallist()) // list of items in order of use recency | ||
priv(this, 'length', 0) // length of items in the list | ||
} | ||
LRUCache.prototype.dump = function () { | ||
var arr = [] | ||
var i = 0 | ||
var size = this._lruList.size | ||
return reverseKeys(this._lruList).map(function (k) { | ||
var hit = this._lruList.get(k) | ||
return priv(this, 'lruList').map(function (hit) { | ||
if (!isStale(this, hit)) { | ||
@@ -168,3 +225,3 @@ return { | ||
} | ||
}, this).filter(function (h) { | ||
}, this).toArray().filter(function (h) { | ||
return h | ||
@@ -175,22 +232,96 @@ }) | ||
LRUCache.prototype.dumpLru = function () { | ||
return this._lruList | ||
return priv(this, 'lruList') | ||
} | ||
LRUCache.prototype.inspect = function (n, opts) { | ||
var str = 'LRUCache {' | ||
var extras = false | ||
var as = priv(this, 'allowStale') | ||
if (as) { | ||
str += '\n allowStale: true' | ||
extras = true | ||
} | ||
var max = priv(this, 'max') | ||
if (max && max !== Infinity) { | ||
if (extras) { | ||
str += ',' | ||
} | ||
str += '\n max: ' + util.inspect(max, opts) | ||
extras = true | ||
} | ||
var maxAge = priv(this, 'maxAge') | ||
if (maxAge) { | ||
if (extras) { | ||
str += ',' | ||
} | ||
str += '\n maxAge: ' + util.inspect(maxAge, opts) | ||
extras = true | ||
} | ||
var lc = priv(this, 'lengthCalculator') | ||
if (lc && lc !== naiveLength) { | ||
if (extras) { | ||
str += ',' | ||
} | ||
str += '\n length: ' + util.inspect(priv(this, 'length'), opts) | ||
extras = true | ||
} | ||
var didFirst = false | ||
priv(this, 'lruList').forEach(function (item) { | ||
if (didFirst) { | ||
str += ',\n ' | ||
} else { | ||
if (extras) { | ||
str += ',\n' | ||
} | ||
didFirst = true | ||
str += '\n ' | ||
} | ||
var key = util.inspect(item.key).split('\n').join('\n ') | ||
var val = { value: item.value } | ||
if (item.maxAge !== maxAge) { | ||
val.maxAge = item.maxAge | ||
} | ||
if (lc !== naiveLength) { | ||
val.length = item.length | ||
} | ||
if (isStale(this, item)) { | ||
val.stale = true | ||
} | ||
val = util.inspect(val, opts).split('\n').join('\n ') | ||
str += key + ' => ' + val | ||
}) | ||
if (didFirst || extras) { | ||
str += '\n' | ||
} | ||
str += '}' | ||
return str | ||
} | ||
LRUCache.prototype.set = function (key, value, maxAge) { | ||
maxAge = maxAge || this._maxAge | ||
maxAge = maxAge || priv(this, 'maxAge') | ||
var now = maxAge ? Date.now() : 0 | ||
var len = this._lengthCalculator(value, key) | ||
var len = priv(this, 'lengthCalculator').call(this, value, key) | ||
if (this._cache.has(key)) { | ||
if (len > this._max) { | ||
del(this, this._cache.get(key)) | ||
if (priv(this, 'cache').has(key)) { | ||
if (len > priv(this, 'max')) { | ||
del(this, priv(this, 'cache').get(key)) | ||
return false | ||
} | ||
var item = this._cache.get(key) | ||
var node = priv(this, 'cache').get(key) | ||
var item = node.value | ||
// dispose of the old one before overwriting | ||
if (this._dispose) | ||
this._dispose(key, item.value) | ||
if (priv(this, 'dispose')) { | ||
priv(this, 'dispose').call(this, key, item.value) | ||
} | ||
@@ -200,28 +331,23 @@ item.now = now | ||
item.value = value | ||
this._length += (len - item.length) | ||
priv(this, 'length', priv(this, 'length') + (len - item.length)) | ||
item.length = len | ||
this.get(key) | ||
if (this._length > this._max) | ||
trim(this) | ||
trim(this) | ||
return true | ||
} | ||
var hit = new Entry(key, value, this._mru, len, now, maxAge) | ||
incMru(this) | ||
var hit = new Entry(key, value, len, now, maxAge) | ||
// oversized objects fall out of cache automatically. | ||
if (hit.length > this._max) { | ||
if (this._dispose) this._dispose(key, value) | ||
if (hit.length > priv(this, 'max')) { | ||
if (priv(this, 'dispose')) { | ||
priv(this, 'dispose').call(this, key, value) | ||
} | ||
return false | ||
} | ||
this._length += hit.length | ||
this._cache.set(key, hit) | ||
this._lruList.set(hit.lu, hit) | ||
if (this._length > this._max) | ||
trim(this) | ||
priv(this, 'length', priv(this, 'length') + hit.length) | ||
priv(this, 'lruList').unshift(hit) | ||
priv(this, 'cache').set(key, priv(this, 'lruList').head) | ||
trim(this) | ||
return true | ||
@@ -231,4 +357,4 @@ } | ||
LRUCache.prototype.has = function (key) { | ||
if (!this._cache.has(key)) return false | ||
var hit = this._cache.get(key) | ||
if (!priv(this, 'cache').has(key)) return false | ||
var hit = priv(this, 'cache').get(key).value | ||
if (isStale(this, hit)) { | ||
@@ -249,14 +375,15 @@ return false | ||
LRUCache.prototype.pop = function () { | ||
var hit = this._lruList.get(this._lru) | ||
del(this, hit) | ||
return hit || null | ||
var node = priv(this, 'lruList').tail | ||
if (!node) return null | ||
del(this, node) | ||
return node.value | ||
} | ||
LRUCache.prototype.del = function (key) { | ||
del(this, this._cache.get(key)) | ||
del(this, priv(this, 'cache').get(key)) | ||
} | ||
LRUCache.prototype.load = function (arr) { | ||
//reset the cache | ||
this.reset(); | ||
// reset the cache | ||
this.reset() | ||
@@ -281,10 +408,20 @@ var now = Date.now() | ||
LRUCache.prototype.prune = function () { | ||
var self = this | ||
priv(this, 'cache').forEach(function (value, key) { | ||
get(self, key, false) | ||
}) | ||
} | ||
function get (self, key, doUse) { | ||
var hit = self._cache.get(key) | ||
if (hit) { | ||
var node = priv(self, 'cache').get(key) | ||
if (node) { | ||
var hit = node.value | ||
if (isStale(self, hit)) { | ||
del(self, hit) | ||
if (!self._allowStale) hit = undefined | ||
del(self, node) | ||
if (!priv(self, 'allowStale')) hit = undefined | ||
} else { | ||
if (doUse) use(self, hit) | ||
if (doUse) { | ||
priv(self, 'lruList').unshiftNode(node) | ||
} | ||
} | ||
@@ -296,5 +433,7 @@ if (hit) hit = hit.value | ||
function isStale(self, hit) { | ||
if (!hit || (!hit.maxAge && !self._maxAge)) return false | ||
var stale = false; | ||
function isStale (self, hit) { | ||
if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) { | ||
return false | ||
} | ||
var stale = false | ||
var diff = Date.now() - hit.now | ||
@@ -304,23 +443,17 @@ if (hit.maxAge) { | ||
} else { | ||
stale = self._maxAge && (diff > self._maxAge) | ||
stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge')) | ||
} | ||
return stale; | ||
return stale | ||
} | ||
function use (self, hit) { | ||
shiftLU(self, hit) | ||
hit.lu = self._mru | ||
incMru(self) | ||
self._lruList.set(hit.lu, hit) | ||
} | ||
function trim (self) { | ||
if (self._length > self._max) { | ||
var keys = reverseKeys(self._lruList) | ||
for (var k = keys.length - 1; self._length > self._max; k--) { | ||
if (priv(self, 'length') > priv(self, 'max')) { | ||
for (var walker = priv(self, 'lruList').tail; | ||
priv(self, 'length') > priv(self, 'max') && walker !== null;) { | ||
// We know that we're about to delete this one, and also | ||
// what the next least recently used key will be, so just | ||
// go ahead and set it now. | ||
self._lru = keys[k - 1] | ||
del(self, self._lruList.get(keys[k])) | ||
var prev = walker.prev | ||
del(self, walker) | ||
walker = prev | ||
} | ||
@@ -330,14 +463,11 @@ } | ||
function shiftLU (self, hit) { | ||
self._lruList.delete(hit.lu) | ||
if (hit.lu === self._lru) | ||
self._lru = reverseKeys(self._lruList).pop() | ||
} | ||
function del (self, hit) { | ||
if (hit) { | ||
if (self._dispose) self._dispose(hit.key, hit.value) | ||
self._length -= hit.length | ||
self._cache.delete(hit.key) | ||
shiftLU(self, hit) | ||
function del (self, node) { | ||
if (node) { | ||
var hit = node.value | ||
if (priv(self, 'dispose')) { | ||
priv(self, 'dispose').call(this, hit.key, hit.value) | ||
} | ||
priv(self, 'length', priv(self, 'length') - hit.length) | ||
priv(self, 'cache').delete(hit.key) | ||
priv(self, 'lruList').removeNode(node) | ||
} | ||
@@ -347,26 +477,8 @@ } | ||
// classy, since V8 prefers predictable objects. | ||
function Entry (key, value, lu, length, now, maxAge) { | ||
function Entry (key, value, length, now, maxAge) { | ||
this.key = key | ||
this.value = value | ||
this.lu = lu | ||
this.length = length | ||
this.now = now | ||
if (maxAge) this.maxAge = maxAge | ||
this.maxAge = maxAge || 0 | ||
} | ||
// Incrementers and decrementers that loop at MAX_SAFE_INTEGER | ||
// only relevant for the lu, lru, and mru counters, since they | ||
// get touched a lot and can get very large. Also, since they | ||
// only go upwards, and the sets will tend to be much smaller than | ||
// the max, we can very well assume that a very small number comes | ||
// after a very large number, rather than before it. | ||
var maxSafeInt = Number.MAX_SAFE_INTEGER || 9007199254740991 | ||
function intInc (number) { | ||
return (number === maxSafeInt) ? 0 : number + 1 | ||
} | ||
function incMru (self) { | ||
do { | ||
self._mru = intInc(self._mru) | ||
} while (self._lruList.has(self._mru)) | ||
} |
{ | ||
"name": "lru-cache", | ||
"description": "A cache object that deletes the least-recently-used items.", | ||
"version": "3.2.0", | ||
"version": "4.0.0", | ||
"author": "Isaac Z. Schlueter <i@izs.me>", | ||
@@ -12,3 +12,4 @@ "keywords": [ | ||
"scripts": { | ||
"test": "tap test --gc" | ||
"test": "tap test --cov", | ||
"posttest": "standard test/*.js lib/*.js" | ||
}, | ||
@@ -18,9 +19,10 @@ "main": "lib/lru-cache.js", | ||
"devDependencies": { | ||
"tap": "^1.2.0", | ||
"weak": "" | ||
"standard": "^5.4.1", | ||
"tap": "^2.3.3" | ||
}, | ||
"license": "ISC", | ||
"dependencies": { | ||
"pseudomap": "^1.0.1" | ||
"pseudomap": "^1.0.1", | ||
"yallist": "^2.0.0" | ||
} | ||
} |
@@ -5,2 +5,4 @@ # lru cache | ||
[![Build Status](https://travis-ci.org/isaacs/node-lru-cache.svg?branch=master)](https://travis-ci.org/isaacs/node-lru-cache) [![Coverage Status](https://coveralls.io/repos/isaacs/node-lru-cache/badge.svg?service=github)](https://coveralls.io/github/isaacs/node-lru-cache) | ||
## Usage: | ||
@@ -69,5 +71,9 @@ | ||
Both of these will update the "recently used"-ness of the key. | ||
They do what you think. `max` is optional and overrides the | ||
cache `max` option if provided. | ||
They do what you think. `maxAge` is optional and overrides the | ||
cache `maxAge` option if provided. | ||
If the key is not found, `get()` will return `undefined`. | ||
The key and val can be any value. | ||
* `peek(key)` | ||
@@ -135,1 +141,5 @@ | ||
into the cache. The destination cache is reset before loading new entries | ||
* `prune()` | ||
Manually iterates over the entire cache proactively pruning old entries |
@@ -1,9 +0,9 @@ | ||
var test = require("tap").test | ||
, LRU = require("../") | ||
var test = require('tap').test | ||
var LRU = require('../') | ||
test("basic", function (t) { | ||
test('basic', function (t) { | ||
var cache = new LRU({max: 10}) | ||
cache.set("key", "value") | ||
t.equal(cache.get("key"), "value") | ||
t.equal(cache.get("nada"), undefined) | ||
cache.set('key', 'value') | ||
t.equal(cache.get('key'), 'value') | ||
t.equal(cache.get('nada'), undefined) | ||
t.equal(cache.length, 1) | ||
@@ -14,34 +14,34 @@ t.equal(cache.max, 10) | ||
test("least recently set", function (t) { | ||
test('least recently set', function (t) { | ||
var cache = new LRU(2) | ||
cache.set("a", "A") | ||
cache.set("b", "B") | ||
cache.set("c", "C") | ||
t.equal(cache.get("c"), "C") | ||
t.equal(cache.get("b"), "B") | ||
t.equal(cache.get("a"), undefined) | ||
cache.set('a', 'A') | ||
cache.set('b', 'B') | ||
cache.set('c', 'C') | ||
t.equal(cache.get('c'), 'C') | ||
t.equal(cache.get('b'), 'B') | ||
t.equal(cache.get('a'), undefined) | ||
t.end() | ||
}) | ||
test("lru recently gotten", function (t) { | ||
test('lru recently gotten', function (t) { | ||
var cache = new LRU(2) | ||
cache.set("a", "A") | ||
cache.set("b", "B") | ||
cache.get("a") | ||
cache.set("c", "C") | ||
t.equal(cache.get("c"), "C") | ||
t.equal(cache.get("b"), undefined) | ||
t.equal(cache.get("a"), "A") | ||
cache.set('a', 'A') | ||
cache.set('b', 'B') | ||
cache.get('a') | ||
cache.set('c', 'C') | ||
t.equal(cache.get('c'), 'C') | ||
t.equal(cache.get('b'), undefined) | ||
t.equal(cache.get('a'), 'A') | ||
t.end() | ||
}) | ||
test("del", function (t) { | ||
test('del', function (t) { | ||
var cache = new LRU(2) | ||
cache.set("a", "A") | ||
cache.del("a") | ||
t.equal(cache.get("a"), undefined) | ||
cache.set('a', 'A') | ||
cache.del('a') | ||
t.equal(cache.get('a'), undefined) | ||
t.end() | ||
}) | ||
test("max", function (t) { | ||
test('max', function (t) { | ||
var cache = new LRU(3) | ||
@@ -51,5 +51,6 @@ | ||
cache.max = 100 | ||
for (var i = 0; i < 100; i ++) cache.set(i, i) | ||
var i | ||
for (i = 0; i < 100; i++) cache.set(i, i) | ||
t.equal(cache.length, 100) | ||
for (var i = 0; i < 100; i ++) { | ||
for (i = 0; i < 100; i++) { | ||
t.equal(cache.get(i), i) | ||
@@ -59,6 +60,6 @@ } | ||
t.equal(cache.length, 3) | ||
for (var i = 0; i < 97; i ++) { | ||
for (i = 0; i < 97; i++) { | ||
t.equal(cache.get(i), undefined) | ||
} | ||
for (var i = 98; i < 100; i ++) { | ||
for (i = 98; i < 100; i++) { | ||
t.equal(cache.get(i), i) | ||
@@ -68,6 +69,6 @@ } | ||
// now remove the max restriction, and try again. | ||
cache.max = "hello" | ||
for (var i = 0; i < 100; i ++) cache.set(i, i) | ||
cache.max = 'hello' | ||
for (i = 0; i < 100; i++) cache.set(i, i) | ||
t.equal(cache.length, 100) | ||
for (var i = 0; i < 100; i ++) { | ||
for (i = 0; i < 100; i++) { | ||
t.equal(cache.get(i), i) | ||
@@ -78,6 +79,6 @@ } | ||
t.equal(cache.length, 3) | ||
for (var i = 0; i < 97; i ++) { | ||
for (i = 0; i < 97; i++) { | ||
t.equal(cache.get(i), undefined) | ||
} | ||
for (var i = 98; i < 100; i ++) { | ||
for (i = 98; i < 100; i++) { | ||
t.equal(cache.get(i), i) | ||
@@ -88,16 +89,15 @@ } | ||
test("reset", function (t) { | ||
test('reset', function (t) { | ||
var cache = new LRU(10) | ||
cache.set("a", "A") | ||
cache.set("b", "B") | ||
cache.set('a', 'A') | ||
cache.set('b', 'B') | ||
cache.reset() | ||
t.equal(cache.length, 0) | ||
t.equal(cache.max, 10) | ||
t.equal(cache.get("a"), undefined) | ||
t.equal(cache.get("b"), undefined) | ||
t.equal(cache.get('a'), undefined) | ||
t.equal(cache.get('b'), undefined) | ||
t.end() | ||
}) | ||
test("basic with weighed length", function (t) { | ||
test('basic with weighed length', function (t) { | ||
var cache = new LRU({ | ||
@@ -110,6 +110,6 @@ max: 100, | ||
}) | ||
cache.set("key", {val: "value", size: 50}) | ||
t.equal(cache.get("key").val, "value") | ||
t.equal(cache.get("nada"), undefined) | ||
t.equal(cache.lengthCalculator(cache.get("key"), 'key'), 50) | ||
cache.set('key', {val: 'value', size: 50}) | ||
t.equal(cache.get('key').val, 'value') | ||
t.equal(cache.get('nada'), undefined) | ||
t.equal(cache.lengthCalculator(cache.get('key'), 'key'), 50) | ||
t.equal(cache.length, 50) | ||
@@ -120,4 +120,3 @@ t.equal(cache.max, 100) | ||
test("weighed length item too large", function (t) { | ||
test('weighed length item too large', function (t) { | ||
var cache = new LRU({ | ||
@@ -130,26 +129,26 @@ max: 10, | ||
// should fall out immediately | ||
cache.set("key", {val: "value", size: 50}) | ||
cache.set('key', {val: 'value', size: 50}) | ||
t.equal(cache.length, 0) | ||
t.equal(cache.get("key"), undefined) | ||
t.equal(cache.get('key'), undefined) | ||
t.end() | ||
}) | ||
test("least recently set with weighed length", function (t) { | ||
test('least recently set with weighed length', function (t) { | ||
var cache = new LRU({ | ||
max:8, | ||
max: 8, | ||
length: function (item) { return item.length } | ||
}) | ||
cache.set("a", "A") | ||
cache.set("b", "BB") | ||
cache.set("c", "CCC") | ||
cache.set("d", "DDDD") | ||
t.equal(cache.get("d"), "DDDD") | ||
t.equal(cache.get("c"), "CCC") | ||
t.equal(cache.get("b"), undefined) | ||
t.equal(cache.get("a"), undefined) | ||
cache.set('a', 'A') | ||
cache.set('b', 'BB') | ||
cache.set('c', 'CCC') | ||
cache.set('d', 'DDDD') | ||
t.equal(cache.get('d'), 'DDDD') | ||
t.equal(cache.get('c'), 'CCC') | ||
t.equal(cache.get('b'), undefined) | ||
t.equal(cache.get('a'), undefined) | ||
t.end() | ||
}) | ||
test("lru recently gotten with weighed length", function (t) { | ||
test('lru recently gotten with weighed length', function (t) { | ||
var cache = new LRU({ | ||
@@ -159,16 +158,16 @@ max: 8, | ||
}) | ||
cache.set("a", "A") | ||
cache.set("b", "BB") | ||
cache.set("c", "CCC") | ||
cache.get("a") | ||
cache.get("b") | ||
cache.set("d", "DDDD") | ||
t.equal(cache.get("c"), undefined) | ||
t.equal(cache.get("d"), "DDDD") | ||
t.equal(cache.get("b"), "BB") | ||
t.equal(cache.get("a"), "A") | ||
cache.set('a', 'A') | ||
cache.set('b', 'BB') | ||
cache.set('c', 'CCC') | ||
cache.get('a') | ||
cache.get('b') | ||
cache.set('d', 'DDDD') | ||
t.equal(cache.get('c'), undefined) | ||
t.equal(cache.get('d'), 'DDDD') | ||
t.equal(cache.get('b'), 'BB') | ||
t.equal(cache.get('a'), 'A') | ||
t.end() | ||
}) | ||
test("lru recently updated with weighed length", function (t) { | ||
test('lru recently updated with weighed length', function (t) { | ||
var cache = new LRU({ | ||
@@ -178,24 +177,24 @@ max: 8, | ||
}) | ||
cache.set("a", "A") | ||
cache.set("b", "BB") | ||
cache.set("c", "CCC") | ||
t.equal(cache.length, 6) //CCC BB A | ||
cache.set("a", "+A") | ||
t.equal(cache.length, 7) //+A CCC BB | ||
cache.set("b", "++BB") | ||
t.equal(cache.length, 6) //++BB +A | ||
t.equal(cache.get("c"), undefined) | ||
cache.set('a', 'A') | ||
cache.set('b', 'BB') | ||
cache.set('c', 'CCC') | ||
t.equal(cache.length, 6) // CCC BB A | ||
cache.set('a', '+A') | ||
t.equal(cache.length, 7) // +A CCC BB | ||
cache.set('b', '++BB') | ||
t.equal(cache.length, 6) // ++BB +A | ||
t.equal(cache.get('c'), undefined) | ||
cache.set("c", "oversized") | ||
t.equal(cache.length, 6) //++BB +A | ||
t.equal(cache.get("c"), undefined) | ||
cache.set('c', 'oversized') | ||
t.equal(cache.length, 6) // ++BB +A | ||
t.equal(cache.get('c'), undefined) | ||
cache.set("a", "oversized") | ||
t.equal(cache.length, 4) //++BB | ||
t.equal(cache.get("a"), undefined) | ||
t.equal(cache.get("b"), "++BB") | ||
cache.set('a', 'oversized') | ||
t.equal(cache.length, 4) // ++BB | ||
t.equal(cache.get('a'), undefined) | ||
t.equal(cache.get('b'), '++BB') | ||
t.end() | ||
}) | ||
test("set returns proper booleans", function(t) { | ||
test('set returns proper booleans', function (t) { | ||
var cache = new LRU({ | ||
@@ -206,13 +205,13 @@ max: 5, | ||
t.equal(cache.set("a", "A"), true) | ||
t.equal(cache.set('a', 'A'), true) | ||
// should return false for max exceeded | ||
t.equal(cache.set("b", "donuts"), false) | ||
t.equal(cache.set('b', 'donuts'), false) | ||
t.equal(cache.set("b", "B"), true) | ||
t.equal(cache.set("c", "CCCC"), true) | ||
t.equal(cache.set('b', 'B'), true) | ||
t.equal(cache.set('c', 'CCCC'), true) | ||
t.end() | ||
}) | ||
test("drop the old items", function(t) { | ||
test('drop the old items', function (t) { | ||
var cache = new LRU({ | ||
@@ -223,22 +222,22 @@ max: 5, | ||
cache.set("a", "A") | ||
cache.set('a', 'A') | ||
setTimeout(function () { | ||
cache.set("b", "b") | ||
t.equal(cache.get("a"), "A") | ||
cache.set('b', 'b') | ||
t.equal(cache.get('a'), 'A') | ||
}, 25) | ||
setTimeout(function () { | ||
cache.set("c", "C") | ||
cache.set('c', 'C') | ||
// timed out | ||
t.notOk(cache.get("a")) | ||
t.notOk(cache.get('a')) | ||
}, 60 + 25) | ||
setTimeout(function () { | ||
t.notOk(cache.get("b")) | ||
t.equal(cache.get("c"), "C") | ||
t.notOk(cache.get('b')) | ||
t.equal(cache.get('c'), 'C') | ||
}, 90) | ||
setTimeout(function () { | ||
t.notOk(cache.get("c")) | ||
t.notOk(cache.get('c')) | ||
t.end() | ||
@@ -248,3 +247,3 @@ }, 155) | ||
test("individual item can have its own maxAge", function(t) { | ||
test('manual pruning', function (t) { | ||
var cache = new LRU({ | ||
@@ -255,10 +254,31 @@ max: 5, | ||
cache.set("a", "A", 20) | ||
cache.set('a', 'A') | ||
cache.set('b', 'b') | ||
cache.set('c', 'C') | ||
setTimeout(function () { | ||
t.notOk(cache.get("a")) | ||
cache.prune() | ||
t.notOk(cache.get('a')) | ||
t.notOk(cache.get('b')) | ||
t.notOk(cache.get('c')) | ||
t.end() | ||
}, 100) | ||
}) | ||
test('individual item can have its own maxAge', function (t) { | ||
var cache = new LRU({ | ||
max: 5, | ||
maxAge: 50 | ||
}) | ||
cache.set('a', 'A', 20) | ||
setTimeout(function () { | ||
t.notOk(cache.get('a')) | ||
t.end() | ||
}, 25) | ||
}) | ||
test("individual item can have its own maxAge > cache's", function(t) { | ||
test('individual item can have its own maxAge > cache', function (t) { | ||
var cache = new LRU({ | ||
@@ -269,5 +289,5 @@ max: 5, | ||
cache.set("a", "A", 50) | ||
cache.set('a', 'A', 50) | ||
setTimeout(function () { | ||
t.equal(cache.get("a"), "A") | ||
t.equal(cache.get('a'), 'A') | ||
t.end() | ||
@@ -277,3 +297,3 @@ }, 25) | ||
test("disposal function", function(t) { | ||
test('disposal function', function (t) { | ||
var disposed = false | ||
@@ -290,4 +310,6 @@ var cache = new LRU({ | ||
t.equal(disposed, 1) | ||
cache.set(2, 10) | ||
t.equal(disposed, 2) | ||
cache.set(3, 3) | ||
t.equal(disposed, 2) | ||
t.equal(disposed, 10) | ||
cache.reset() | ||
@@ -298,3 +320,3 @@ t.equal(disposed, 3) | ||
test("disposal function on too big of item", function(t) { | ||
test('disposal function on too big of item', function (t) { | ||
var disposed = false | ||
@@ -313,3 +335,3 @@ var cache = new LRU({ | ||
t.equal(disposed, false) | ||
cache.set("obj", obj) | ||
cache.set('obj', obj) | ||
t.equal(disposed, obj) | ||
@@ -319,3 +341,3 @@ t.end() | ||
test("has()", function(t) { | ||
test('has()', function (t) { | ||
var cache = new LRU({ | ||
@@ -331,3 +353,3 @@ max: 1, | ||
t.equal(cache.has('blu'), true) | ||
setTimeout(function() { | ||
setTimeout(function () { | ||
t.equal(cache.has('blu'), false) | ||
@@ -338,3 +360,3 @@ t.end() | ||
test("stale", function(t) { | ||
test('stale', function (t) { | ||
var cache = new LRU({ | ||
@@ -345,6 +367,8 @@ maxAge: 10, | ||
t.equal(cache.allowStale, true) | ||
cache.set('foo', 'bar') | ||
t.equal(cache.get('foo'), 'bar') | ||
t.equal(cache.has('foo'), true) | ||
setTimeout(function() { | ||
setTimeout(function () { | ||
t.equal(cache.has('foo'), false) | ||
@@ -357,10 +381,10 @@ t.equal(cache.get('foo'), 'bar') | ||
test("lru update via set", function(t) { | ||
var cache = LRU({ max: 2 }); | ||
test('lru update via set', function (t) { | ||
var cache = LRU({ max: 2 }) | ||
cache.set('foo', 1); | ||
cache.set('bar', 2); | ||
cache.del('bar'); | ||
cache.set('baz', 3); | ||
cache.set('qux', 4); | ||
cache.set('foo', 1) | ||
cache.set('bar', 2) | ||
cache.del('bar') | ||
cache.set('baz', 3) | ||
cache.set('qux', 4) | ||
@@ -374,21 +398,21 @@ t.equal(cache.get('foo'), undefined) | ||
test("least recently set w/ peek", function (t) { | ||
test('least recently set w/ peek', function (t) { | ||
var cache = new LRU(2) | ||
cache.set("a", "A") | ||
cache.set("b", "B") | ||
t.equal(cache.peek("a"), "A") | ||
cache.set("c", "C") | ||
t.equal(cache.get("c"), "C") | ||
t.equal(cache.get("b"), "B") | ||
t.equal(cache.get("a"), undefined) | ||
cache.set('a', 'A') | ||
cache.set('b', 'B') | ||
t.equal(cache.peek('a'), 'A') | ||
cache.set('c', 'C') | ||
t.equal(cache.get('c'), 'C') | ||
t.equal(cache.get('b'), 'B') | ||
t.equal(cache.get('a'), undefined) | ||
t.end() | ||
}) | ||
test("pop the least used item", function (t) { | ||
test('pop the least used item', function (t) { | ||
var cache = new LRU(3) | ||
, last | ||
var last | ||
cache.set("a", "A") | ||
cache.set("b", "B") | ||
cache.set("c", "C") | ||
cache.set('a', 'A') | ||
cache.set('b', 'B') | ||
cache.set('c', 'C') | ||
@@ -399,7 +423,7 @@ t.equal(cache.length, 3) | ||
// Ensure we pop a, c, b | ||
cache.get("b", "B") | ||
cache.get('b', 'B') | ||
last = cache.pop() | ||
t.equal(last.key, "a") | ||
t.equal(last.value, "A") | ||
t.equal(last.key, 'a') | ||
t.equal(last.value, 'A') | ||
t.equal(cache.length, 2) | ||
@@ -409,4 +433,4 @@ t.equal(cache.max, 3) | ||
last = cache.pop() | ||
t.equal(last.key, "c") | ||
t.equal(last.value, "C") | ||
t.equal(last.key, 'c') | ||
t.equal(last.value, 'C') | ||
t.equal(cache.length, 1) | ||
@@ -416,4 +440,4 @@ t.equal(cache.max, 3) | ||
last = cache.pop() | ||
t.equal(last.key, "b") | ||
t.equal(last.value, "B") | ||
t.equal(last.key, 'b') | ||
t.equal(last.value, 'B') | ||
t.equal(cache.length, 0) | ||
@@ -430,9 +454,9 @@ t.equal(cache.max, 3) | ||
test("get and set only accepts strings and numbers as keys", function(t) { | ||
test('get and set only accepts strings and numbers as keys', function (t) { | ||
var cache = new LRU() | ||
cache.set("key", "value") | ||
cache.set('key', 'value') | ||
cache.set(123, 456) | ||
t.equal(cache.get("key"), "value") | ||
t.equal(cache.get('key'), 'value') | ||
t.equal(cache.get(123), 456) | ||
@@ -443,13 +467,13 @@ | ||
test("peek with wierd keys", function(t) { | ||
test('peek with wierd keys', function (t) { | ||
var cache = new LRU() | ||
cache.set("key", "value") | ||
cache.set('key', 'value') | ||
cache.set(123, 456) | ||
t.equal(cache.peek("key"), "value") | ||
t.equal(cache.peek('key'), 'value') | ||
t.equal(cache.peek(123), 456) | ||
t.equal(cache.peek({ | ||
toString: function() { return "key" } | ||
toString: function () { return 'key' } | ||
}), undefined) | ||
@@ -459,1 +483,70 @@ | ||
}) | ||
test('invalid length calc results in basic length', function (t) { | ||
var l = new LRU({ length: true }) | ||
t.isa(l.lengthCalculator, 'function') | ||
l.lengthCalculator = 'not a function' | ||
t.isa(l.lengthCalculator, 'function') | ||
t.end() | ||
}) | ||
test('change length calculator recalculates', function (t) { | ||
var l = new LRU({ max: 3 }) | ||
l.set(2, 2) | ||
l.set(1, 1) | ||
l.lengthCalculator = function (key, val) { | ||
return key + val | ||
} | ||
t.equal(l.itemCount, 1) | ||
t.equal(l.get(2), undefined) | ||
t.equal(l.get(1), 1) | ||
l.set(0, 1) | ||
t.equal(l.itemCount, 2) | ||
l.lengthCalculator = function (key, val) { | ||
return key | ||
} | ||
t.equal(l.lengthCalculator(1, 10), 1) | ||
t.equal(l.lengthCalculator(10, 1), 10) | ||
l.lengthCalculator = { not: 'a function' } | ||
t.equal(l.lengthCalculator(1, 10), 1) | ||
t.equal(l.lengthCalculator(10, 1), 1) | ||
t.end() | ||
}) | ||
test('delete non-existent item has no effect', function (t) { | ||
var l = new LRU({ max: 2 }) | ||
l.set('foo', 1) | ||
l.set('bar', 2) | ||
l.del('baz') | ||
t.same(l.dumpLru().toArray().map(function (hit) { | ||
return hit.key | ||
}), [ 'bar', 'foo' ]) | ||
t.end() | ||
}) | ||
test('maxAge on list, cleared in forEach', function (t) { | ||
var l = new LRU({ stale: true }) | ||
l.set('foo', 1) | ||
// hacky. make it seem older. | ||
l.dumpLru().head.value.now = Date.now() - 100000 | ||
// setting maxAge to invalid values does nothing. | ||
t.equal(l.maxAge, 0) | ||
l.maxAge = -100 | ||
t.equal(l.maxAge, 0) | ||
l.maxAge = {} | ||
t.equal(l.maxAge, 0) | ||
l.maxAge = 1 | ||
var saw = false | ||
l.forEach(function (val, key) { | ||
saw = true | ||
t.equal(key, 'foo') | ||
}) | ||
t.ok(saw) | ||
t.equal(l.length, 0) | ||
t.end() | ||
}) |
@@ -6,7 +6,8 @@ var test = require('tap').test | ||
var l = new LRU(5) | ||
for (var i = 0; i < 10; i ++) { | ||
var i | ||
for (i = 0; i < 10; i++) { | ||
l.set(i, i.toString(2)) | ||
} | ||
var i = 9 | ||
i = 9 | ||
l.forEach(function (val, key, cache) { | ||
@@ -24,6 +25,6 @@ t.equal(cache, l) | ||
var order = [ 8, 6, 9, 7, 5 ] | ||
var i = 0 | ||
i = 0 | ||
l.forEach(function (val, key, cache) { | ||
var j = order[i ++] | ||
var j = order[i++] | ||
t.equal(cache, l) | ||
@@ -38,3 +39,3 @@ t.equal(key, j) | ||
l.rforEach(function (val, key, cache) { | ||
var j = order[i ++] | ||
var j = order[i++] | ||
t.equal(cache, l) | ||
@@ -51,3 +52,4 @@ t.equal(key, j) | ||
var l = new LRU(5) | ||
for (var i = 0; i < 10; i ++) { | ||
var i | ||
for (i = 0; i < 10; i++) { | ||
l.set(i, i.toString(2)) | ||
@@ -69,9 +71,10 @@ } | ||
test('all entries are iterated over', function(t) { | ||
test('all entries are iterated over', function (t) { | ||
var l = new LRU(5) | ||
for (var i = 0; i < 10; i ++) { | ||
var i | ||
for (i = 0; i < 10; i++) { | ||
l.set(i.toString(), i.toString(2)) | ||
} | ||
var i = 0 | ||
i = 0 | ||
l.forEach(function (val, key, cache) { | ||
@@ -90,9 +93,10 @@ if (i > 0) { | ||
test('all stale entries are removed', function(t) { | ||
test('all stale entries are removed', function (t) { | ||
var l = new LRU({ max: 5, maxAge: -5, stale: true }) | ||
for (var i = 0; i < 10; i ++) { | ||
var i | ||
for (i = 0; i < 10; i++) { | ||
l.set(i.toString(), i.toString(2)) | ||
} | ||
var i = 0 | ||
i = 0 | ||
l.forEach(function () { | ||
@@ -113,7 +117,8 @@ i += 1 | ||
}) | ||
for (var i = 0; i < 10; i++) { | ||
var i | ||
for (i = 0; i < 10; i++) { | ||
l.set(i.toString(), i.toString(2), ((i % 2) ? 25 : undefined)) | ||
} | ||
var i = 0 | ||
i = 0 | ||
var order = [ 8, 6, 4, 2, 0 ] | ||
@@ -127,12 +132,11 @@ setTimeout(function () { | ||
}) | ||
t.equal(i, order.length); | ||
t.equal(i, order.length) | ||
setTimeout(function () { | ||
var count = 0; | ||
l.forEach(function (val, key, cache) { count++; }) | ||
t.equal(0, count); | ||
var count = 0 | ||
l.forEach(function (val, key, cache) { count++ }) | ||
t.equal(0, count) | ||
t.end() | ||
}, 25) | ||
}, 26) | ||
}) |
var test = require('tap').test | ||
var LRU = require('../') | ||
var Yallist = require('yallist') | ||
@@ -7,9 +8,9 @@ test('dump', function (t) { | ||
t.equal(cache.dump().length, 0, "nothing in dump for empty cache") | ||
t.equal(cache.dump().length, 0, 'nothing in dump for empty cache') | ||
cache.set("a", "A") | ||
cache.set("b", "B") | ||
cache.set('a', 'A') | ||
cache.set('b', 'B') | ||
t.deepEqual(cache.dump(), [ | ||
{ k: "b", v: "B", e: 0 }, | ||
{ k: "a", v: "A", e: 0 } | ||
{ k: 'b', v: 'B', e: 0 }, | ||
{ k: 'a', v: 'A', e: 0 } | ||
]) | ||
@@ -20,22 +21,22 @@ | ||
{ k: 123, v: 456, e: 0 }, | ||
{ k: "b", v: "B", e: 0 }, | ||
{ k: "a", v: "A", e: 0 }, | ||
{ k: 'b', v: 'B', e: 0 }, | ||
{ k: 'a', v: 'A', e: 0 } | ||
]) | ||
cache.del(123) | ||
cache.set("a", "A"); | ||
cache.set('a', 'A') | ||
t.deepEqual(cache.dump(), [ | ||
{ k: "a", v: "A", e: 0 }, | ||
{ k: "b", v: "B", e: 0 } | ||
{ k: 'a', v: 'A', e: 0 }, | ||
{ k: 'b', v: 'B', e: 0 } | ||
]) | ||
cache.get("b"); | ||
cache.get('b') | ||
t.deepEqual(cache.dump(), [ | ||
{ k: "b", v: "B", e: 0 }, | ||
{ k: "a", v: "A", e: 0 } | ||
{ k: 'b', v: 'B', e: 0 }, | ||
{ k: 'a', v: 'A', e: 0 } | ||
]) | ||
cache.del("a"); | ||
cache.del('a') | ||
t.deepEqual(cache.dump(), [ | ||
{ k: "b", v: "B", e: 0 } | ||
{ k: 'b', v: 'B', e: 0 } | ||
]) | ||
@@ -46,3 +47,3 @@ | ||
test("do not dump stale items", function(t) { | ||
test('do not dump stale items', function (t) { | ||
var cache = new LRU({ | ||
@@ -53,30 +54,30 @@ max: 5, | ||
//expires at 50 | ||
cache.set("a", "A") | ||
// expires at 50 | ||
cache.set('a', 'A') | ||
setTimeout(function () { | ||
//expires at 75 | ||
cache.set("b", "B") | ||
// expires at 75 | ||
cache.set('b', 'B') | ||
var s = cache.dump() | ||
t.equal(s.length, 2) | ||
t.equal(s[0].k, "b") | ||
t.equal(s[1].k, "a") | ||
t.equal(s[0].k, 'b') | ||
t.equal(s[1].k, 'a') | ||
}, 25) | ||
setTimeout(function () { | ||
//expires at 110 | ||
cache.set("c", "C") | ||
// expires at 110 | ||
cache.set('c', 'C') | ||
var s = cache.dump() | ||
t.equal(s.length, 2) | ||
t.equal(s[0].k, "c") | ||
t.equal(s[1].k, "b") | ||
t.equal(s[0].k, 'c') | ||
t.equal(s[1].k, 'b') | ||
}, 60) | ||
setTimeout(function () { | ||
//expires at 130 | ||
cache.set("d", "D", 40) | ||
// expires at 130 | ||
cache.set('d', 'D', 40) | ||
var s = cache.dump() | ||
t.equal(s.length, 2) | ||
t.equal(s[0].k, "d") | ||
t.equal(s[1].k, "c") | ||
t.equal(s[0].k, 'd') | ||
t.equal(s[1].k, 'c') | ||
}, 90) | ||
@@ -87,3 +88,3 @@ | ||
t.equal(s.length, 1) | ||
t.equal(s[0].k, "d") | ||
t.equal(s[0].k, 'd') | ||
}, 120) | ||
@@ -98,8 +99,8 @@ | ||
test("load basic cache", function(t) { | ||
var cache = new LRU(), | ||
copy = new LRU() | ||
test('load basic cache', function (t) { | ||
var cache = new LRU() | ||
var copy = new LRU() | ||
cache.set("a", "A") | ||
cache.set("b", "B") | ||
cache.set('a', 'A') | ||
cache.set('b', 'B') | ||
cache.set(123, 456) | ||
@@ -113,13 +114,12 @@ | ||
test('load staled cache', function (t) { | ||
var cache = new LRU({maxAge: 50}) | ||
var copy = new LRU({maxAge: 50}) | ||
var arr | ||
test("load staled cache", function(t) { | ||
var cache = new LRU({maxAge: 50}), | ||
copy = new LRU({maxAge: 50}), | ||
arr | ||
//expires at 50 | ||
cache.set("a", "A") | ||
// expires at 50 | ||
cache.set('a', 'A') | ||
setTimeout(function () { | ||
//expires at 80 | ||
cache.set("b", "B") | ||
// expires at 80 | ||
cache.set('b', 'B') | ||
arr = cache.dump() | ||
@@ -131,8 +131,8 @@ t.equal(arr.length, 2) | ||
copy.load(arr) | ||
t.equal(copy.get("a"), undefined) | ||
t.equal(copy.get("b"), "B") | ||
t.equal(copy.get('a'), undefined) | ||
t.equal(copy.get('b'), 'B') | ||
}, 60) | ||
setTimeout(function () { | ||
t.equal(copy.get("b"), undefined) | ||
t.equal(copy.get('b'), undefined) | ||
t.end() | ||
@@ -142,18 +142,18 @@ }, 90) | ||
test("load to other size cache", function(t) { | ||
var cache = new LRU({max: 2}), | ||
copy = new LRU({max: 1}) | ||
test('load to other size cache', function (t) { | ||
var cache = new LRU({max: 2}) | ||
var copy = new LRU({max: 1}) | ||
cache.set("a", "A") | ||
cache.set("b", "B") | ||
cache.set('a', 'A') | ||
cache.set('b', 'B') | ||
copy.load(cache.dump()) | ||
t.equal(copy.get("a"), undefined) | ||
t.equal(copy.get("b"), "B") | ||
t.equal(copy.get('a'), undefined) | ||
t.equal(copy.get('b'), 'B') | ||
//update the last read from original cache | ||
cache.get("a") | ||
// update the last read from original cache | ||
cache.get('a') | ||
copy.load(cache.dump()) | ||
t.equal(copy.get("a"), "A") | ||
t.equal(copy.get("b"), undefined) | ||
t.equal(copy.get('a'), 'A') | ||
t.equal(copy.get('b'), undefined) | ||
@@ -163,72 +163,75 @@ t.end() | ||
test('load to other age cache', function (t) { | ||
var cache = new LRU({maxAge: 250}) | ||
var aged = new LRU({maxAge: 500}) | ||
var simple = new LRU() | ||
var arr | ||
test("load to other age cache", function(t) { | ||
var cache = new LRU({maxAge: 50}), | ||
aged = new LRU({maxAge: 100}), | ||
simple = new LRU(), | ||
arr, | ||
expired | ||
//created at 0 | ||
//a would be valid till 0 + 50 | ||
cache.set("a", "A") | ||
// created at 0 | ||
// a would be valid till 0 + 250 | ||
cache.set('a', 'A') | ||
setTimeout(function () { | ||
//created at 20 | ||
//b would be valid till 20 + 50 | ||
cache.set("b", "B") | ||
//b would be valid till 20 + 70 | ||
cache.set("c", "C", 70) | ||
// created at 20 | ||
// b would be valid till 100 + 250 | ||
cache.set('b', 'B') | ||
// b would be valid till 100 + 350 | ||
cache.set('c', 'C', 350) | ||
arr = cache.dump() | ||
t.equal(arr.length, 3) | ||
}, 20) | ||
}, 100) | ||
setTimeout(function () { | ||
t.equal(cache.get("a"), undefined) | ||
t.equal(cache.get("b"), "B") | ||
t.equal(cache.get("c"), "C") | ||
t.equal(cache.get('a'), undefined) | ||
t.equal(cache.get('b'), 'B') | ||
t.equal(cache.get('c'), 'C') | ||
aged.load(arr) | ||
t.equal(aged.get("a"), undefined) | ||
t.equal(aged.get("b"), "B") | ||
t.equal(aged.get("c"), "C") | ||
t.equal(aged.get('a'), undefined) | ||
t.equal(aged.get('b'), 'B') | ||
t.equal(aged.get('c'), 'C') | ||
simple.load(arr) | ||
t.equal(simple.get("a"), undefined) | ||
t.equal(simple.get("b"), "B") | ||
t.equal(simple.get("c"), "C") | ||
}, 60) | ||
t.equal(simple.get('a'), undefined) | ||
t.equal(simple.get('b'), 'B') | ||
t.equal(simple.get('c'), 'C') | ||
}, 300) | ||
setTimeout(function () { | ||
t.equal(cache.get("a"), undefined) | ||
t.equal(cache.get("b"), undefined) | ||
t.equal(cache.get("c"), "C") | ||
t.equal(cache.get('a'), undefined) | ||
t.equal(cache.get('b'), undefined) | ||
t.equal(cache.get('c'), 'C') | ||
aged.load(arr) | ||
t.equal(aged.get("a"), undefined) | ||
t.equal(aged.get("b"), undefined) | ||
t.equal(aged.get("c"), "C") | ||
t.equal(aged.get('a'), undefined) | ||
t.equal(aged.get('b'), undefined) | ||
t.equal(aged.get('c'), 'C') | ||
simple.load(arr) | ||
t.equal(simple.get("a"), undefined) | ||
t.equal(simple.get("b"), undefined) | ||
t.equal(simple.get("c"), "C") | ||
}, 80) | ||
t.equal(simple.get('a'), undefined) | ||
t.equal(simple.get('b'), undefined) | ||
t.equal(simple.get('c'), 'C') | ||
}, 400) | ||
setTimeout(function () { | ||
t.equal(cache.get("a"), undefined) | ||
t.equal(cache.get("b"), undefined) | ||
t.equal(cache.get("c"), undefined) | ||
t.equal(cache.get('a'), undefined) | ||
t.equal(cache.get('b'), undefined) | ||
t.equal(cache.get('c'), undefined) | ||
aged.load(arr) | ||
t.equal(aged.get("a"), undefined) | ||
t.equal(aged.get("b"), undefined) | ||
t.equal(aged.get("c"), undefined) | ||
t.equal(aged.get('a'), undefined) | ||
t.equal(aged.get('b'), undefined) | ||
t.equal(aged.get('c'), undefined) | ||
simple.load(arr) | ||
t.equal(simple.get("a"), undefined) | ||
t.equal(simple.get("b"), undefined) | ||
t.equal(simple.get("c"), undefined) | ||
t.equal(simple.get('a'), undefined) | ||
t.equal(simple.get('b'), undefined) | ||
t.equal(simple.get('c'), undefined) | ||
t.end() | ||
}, 100) | ||
}, 500) | ||
}) | ||
test('dumpLru', function (t) { | ||
var l = LRU() | ||
t.isa(l.dumpLru(), Yallist) | ||
t.end() | ||
}) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
38737
13
1220
143
2
1
+ Addedyallist@^2.0.0
+ Addedyallist@2.1.2(transitive)