UNPKG

@lodestar/utils

Version:

Utilities required across multiple lodestar packages

95 lines 2.33 kB
export class MapDef extends Map { getDefault; constructor(getDefault) { super(); this.getDefault = getDefault; } getOrDefault(key) { let value = super.get(key); if (value === undefined) { value = this.getDefault(); this.set(key, value); } return value; } } /** * Extends MapDef but ensures that there always a max of `maxKeys` keys */ export class MapDefMax { getDefault; maxKeys; map = new Map(); constructor(getDefault, maxKeys) { this.getDefault = getDefault; this.maxKeys = maxKeys; } getOrDefault(key) { let value = this.map.get(key); if (value === undefined) { value = this.getDefault(); this.map.set(key, value); pruneSetToMax(this.map, this.maxKeys); } return value; } get(key) { return this.map.get(key); } } /** * 2 dimensions Es6 Map */ export class Map2d { map = new Map(); get(k1, k2) { return this.map.get(k1)?.get(k2); } set(k1, k2, v) { let map2 = this.map.get(k1); if (!map2) { map2 = new Map(); this.map.set(k1, map2); } map2.set(k2, v); } } /** * 2 dimensions Es6 Map + regular array */ export class Map2dArr { map = new Map(); get(k1, idx) { return this.map.get(k1)?.[idx]; } set(k1, idx, v) { let arr = this.map.get(k1); if (!arr) { arr = []; this.map.set(k1, arr); } arr[idx] = v; } } /** * Prune an arbitrary set removing the first keys to have a set.size === maxItems. * Returns the count of deleted items. * * Keys can be sorted by `compareFn` to get more control over which items to prune first */ export function pruneSetToMax(set, maxItems, compareFn) { let itemsToDelete = set.size - maxItems; const deletedItems = Math.max(0, itemsToDelete); if (itemsToDelete > 0) { const keys = compareFn ? Array.from(set.keys()).sort(compareFn) : set.keys(); for (const key of keys) { set.delete(key); itemsToDelete--; if (itemsToDelete <= 0) { break; } } } return deletedItems; } //# sourceMappingURL=map.js.map