119 lines
2.2 KiB
JavaScript
119 lines
2.2 KiB
JavaScript
/**
|
|
* Utility module to work with key-value stores.
|
|
*
|
|
* @module map
|
|
*/
|
|
|
|
/**
|
|
* @template K
|
|
* @template V
|
|
* @typedef {Map<K,V>} GlobalMap
|
|
*/
|
|
|
|
/**
|
|
* 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 K,V
|
|
* @param {Map<K,V>} m
|
|
* @return {Map<K,V>}
|
|
*/
|
|
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 {Map<any, any>} MAP
|
|
* @template {MAP extends Map<any,infer V> ? function():V : unknown} CF
|
|
* @param {MAP} map
|
|
* @param {MAP extends Map<infer K,any> ? K : unknown} key
|
|
* @param {CF} createT
|
|
* @return {ReturnType<CF>}
|
|
*/
|
|
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
|
|
}
|