/** * Exclude up to `ineed` items from a set if item meets condition `cond` */ export function removeItemsFromSet ( superSet: Set, ineed: number, cond: (peer: T) => boolean = () => true ): Set { const subset = new Set() if (ineed <= 0) return subset for (const id of superSet) { if (subset.size >= ineed) break if (cond(id)) { subset.add(id) superSet.delete(id) } } return subset } /** * Exclude up to `ineed` items from a set */ export function removeFirstNItemsFromSet (superSet: Set, ineed: number): Set { return removeItemsFromSet(superSet, ineed, () => true) } export class MapDef extends Map { constructor (private readonly getDefault: () => V) { super() } getOrDefault (key: K): V { let value = super.get(key) if (value === undefined) { value = this.getDefault() this.set(key, value) } return value } }