@lodestar/utils
Version:
Utilities required across multiple lodestar packages
96 lines • 2.37 kB
JavaScript
export class MapDef extends Map {
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 {
constructor(getDefault, maxKeys) {
this.getDefault = getDefault;
this.maxKeys = maxKeys;
this.map = new Map();
}
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 {
constructor() {
this.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 {
constructor() {
this.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