| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | 'use strict';class QuickLRU {	constructor(options = {}) {		if (!(options.maxSize && options.maxSize > 0)) {			throw new TypeError('`maxSize` must be a number greater than 0');		}		this.maxSize = options.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.oldCache.delete(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) {		const deleted = this.cache.delete(key);		if (deleted) {			this._size--;		}		return this.oldCache.delete(key) || deleted;	}	clear() {		this.cache.clear();		this.oldCache.clear();		this._size = 0;	}	* keys() {		for (const [key] of this) {			yield key;		}	}	* values() {		for (const [, value] of this) {			yield value;		}	}	* [Symbol.iterator]() {		for (const item of this.cache) {			yield item;		}		for (const item of this.oldCache) {			const [key] = item;			if (!this.cache.has(key)) {				yield item;			}		}	}	get size() {		let oldCacheSize = 0;		for (const key of this.oldCache.keys()) {			if (!this.cache.has(key)) {				oldCacheSize++;			}		}		return this._size + oldCacheSize;	}}module.exports = QuickLRU;
 |