diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/quick-lru/index.js | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/quick-lru/index.js')
| -rw-r--r-- | node_modules/quick-lru/index.js | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/node_modules/quick-lru/index.js b/node_modules/quick-lru/index.js new file mode 100644 index 00000000..d9191a0c --- /dev/null +++ b/node_modules/quick-lru/index.js @@ -0,0 +1,114 @@ +'use strict'; + +class QuickLRU { + constructor(opts) { + opts = Object.assign({}, opts); + + if (!(opts.maxSize && opts.maxSize > 0)) { + throw new TypeError('`maxSize` must be a number greater than 0'); + } + + this.maxSize = opts.maxSize; + this.cache = new Map(); + this.oldCache = new Map(); + this._size = 0; + } + + _set(key, value) { + this.cache.set(key, value); + this._size++; + + if (this._size >= this.maxSize) { + this._size = 0; + this.oldCache = this.cache; + this.cache = new Map(); + } + } + + get(key) { + if (this.cache.has(key)) { + return this.cache.get(key); + } + + if (this.oldCache.has(key)) { + const value = this.oldCache.get(key); + this._set(key, value); + return value; + } + } + + set(key, value) { + if (this.cache.has(key)) { + this.cache.set(key, value); + } else { + this._set(key, value); + } + + return this; + } + + has(key) { + return this.cache.has(key) || this.oldCache.has(key); + } + + peek(key) { + if (this.cache.has(key)) { + return this.cache.get(key); + } + + if (this.oldCache.has(key)) { + return this.oldCache.get(key); + } + } + + delete(key) { + if (this.cache.delete(key)) { + this._size--; + } + + this.oldCache.delete(key); + } + + clear() { + this.cache.clear(); + this.oldCache.clear(); + this._size = 0; + } + + * keys() { + for (const el of this) { + yield el[0]; + } + } + + * values() { + for (const el of this) { + yield el[1]; + } + } + + * [Symbol.iterator]() { + for (const el of this.cache) { + yield el; + } + + for (const el of this.oldCache) { + if (!this.cache.has(el[0])) { + yield el; + } + } + } + + get size() { + let oldCacheSize = 0; + for (const el of this.oldCache) { + if (!this.cache.has(el[0])) { + oldCacheSize++; + } + } + + return this._size + oldCacheSize; + } +} + +module.exports = QuickLRU; |
