UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

105 lines 7.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SearchCache = void 0; const Queue_1 = require("../Queue"); /** * A class to cache items that are created for a search, such that items aren't constantly replaced */ class SearchCache { /** * Creates a new search cache * @param create The function to create new values * @param maxSize The maximum number of items to keep in the cache */ constructor(create, maxSize = 50) { this.map = new Map(); this.queue = new Queue_1.Queue(); this.maxSize = 0; this.create = create; this.maxSize = maxSize; } /** * Retrieves multiple items, either from the cache or newly created * @param items The keys of the items to get * @returns The items */ getAll(items) { return items.map(key => key instanceof Array ? this.get(...key) : /** @ts-ignore */ this.get(key)); } /** * Retrieves an item, either from the cache or newly created * @param keys The keys to get the item for * @returns The item */ get(...keys) { // If the map contains the value, return it let map = this.map; for (let i = 0; i < keys.length - 1; i++) { const key = keys[i]; if (!(map instanceof Map)) break; map = map.get(key); } const lastKey = keys[keys.length - 1]; const data = map === null || map === void 0 ? void 0 : map.get(lastKey); if (data) { const { node, value } = data; // Add the keys to the back of the queue this.queue.removeNode(node); const newNode = this.queue.push(keys); map.set(lastKey, { value, node: newNode }); return value; } // Otherwise, create the value and store it const node = this.queue.push(keys); const value = this.create(...keys); this.add(this.map, keys, value, node); if (this.queue.getSize() > this.maxSize) { const removeKey = this.queue.pop(); if (removeKey) this.remove(this.map, removeKey); } return value; } /** * Adds an item to the cache map * @param map The map to add the value to * @param keys The keys to add the value under * @param value The value to add * @param node The queue node to store in the map */ add(map, [key, ...keys], value, node) { if (keys.length > 0) { let subMap = map.get(key); if (!subMap) { subMap = new Map(); map.set(key, subMap); } this.add(subMap, keys, value, node); } else map.set(key, { value, node }); } /** * Removes an item from the cache * @param map The map to add the value to * @param keys The keys to remove the value from */ remove(map, [key, ...keys]) { if (keys.length > 0) { let subMap = map.get(key); if (subMap) { this.remove(subMap, keys); if (subMap.size == 0) map.delete(key); } } else map.delete(key); } } exports.SearchCache = SearchCache; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoQ2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvc2VhcmNoL1NlYXJjaENhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9DQUErQjtBQU8vQjs7R0FFRztBQUNILE1BQWEsV0FBVztJQU1wQjs7OztPQUlHO0lBQ0gsWUFBbUIsTUFBd0IsRUFBRSxVQUFrQixFQUFFO1FBVHZELFFBQUcsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztRQUMvQyxVQUFLLEdBQWEsSUFBSSxhQUFLLEVBQUUsQ0FBQztRQUM5QixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBUTFCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLEtBQXdCO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUNuQixHQUFHLFlBQVksS0FBSztZQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFJLEdBQVcsQ0FBQztZQUMzQixDQUFDLENBQUMsaUJBQWlCO2dCQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUN0QixDQUFDO0lBQ04sQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxHQUFHLENBQUMsR0FBRyxJQUFPO1FBQ2pCLDJDQUEyQztRQUMzQyxJQUFJLEdBQUcsR0FBa0IsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxDQUFDLEdBQUcsWUFBWSxHQUFH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