@launchmenu/core
Version:
An environment for visual keyboard controlled applets
105 lines • 7.2 kB
JavaScript
"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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