UNPKG

lib0

Version:

> Monorepo of isomorphic utility functions

113 lines (106 loc) 2.11 kB
/** * Utility module to work with key-value stores. * * @module map */ /** * Creates a new Map instance. * * @function * @return {Map<any, any>} * * @function */ export const create = () => new Map() /** * Copy a Map object into a fresh Map object. * * @function * @template X,Y * @param {Map<X,Y>} m * @return {Map<X,Y>} */ export const copy = m => { const r = create() m.forEach((v, k) => { r.set(k, v) }) return r } /** * Get map property. Create T if property is undefined and set T on map. * * ```js * const listeners = map.setIfUndefined(events, 'eventName', set.create) * listeners.add(listener) * ``` * * @function * @template V,K * @template {Map<K,V>} MAP * @param {MAP} map * @param {K} key * @param {function():V} createT * @return {V} */ export const setIfUndefined = (map, key, createT) => { let set = map.get(key) if (set === undefined) { map.set(key, set = createT()) } return set } /** * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function. * * @function * @template K * @template V * @template R * @param {Map<K,V>} m * @param {function(V,K):R} f * @return {Array<R>} */ export const map = (m, f) => { const res = [] for (const [key, value] of m) { res.push(f(value, key)) } return res } /** * Tests whether any key-value pairs pass the test implemented by `f(value, key)`. * * @todo should rename to some - similarly to Array.some * * @function * @template K * @template V * @param {Map<K,V>} m * @param {function(V,K):boolean} f * @return {boolean} */ export const any = (m, f) => { for (const [key, value] of m) { if (f(value, key)) { return true } } return false } /** * Tests whether all key-value pairs pass the test implemented by `f(value, key)`. * * @function * @template K * @template V * @param {Map<K,V>} m * @param {function(V,K):boolean} f * @return {boolean} */ export const all = (m, f) => { for (const [key, value] of m) { if (!f(value, key)) { return false } } return true }