140 lines
2.6 KiB
JavaScript
140 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* 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
|
|
*/
|
|
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>}
|
|
*/
|
|
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>}
|
|
*/
|
|
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>}
|
|
*/
|
|
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}
|
|
*/
|
|
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}
|
|
*/
|
|
const all = (m, f) => {
|
|
for (const [key, value] of m) {
|
|
if (!f(value, key)) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
};
|
|
|
|
var map$1 = /*#__PURE__*/Object.freeze({
|
|
__proto__: null,
|
|
create: create,
|
|
copy: copy,
|
|
setIfUndefined: setIfUndefined,
|
|
map: map,
|
|
any: any,
|
|
all: all
|
|
});
|
|
|
|
exports.all = all;
|
|
exports.any = any;
|
|
exports.copy = copy;
|
|
exports.create = create;
|
|
exports.map = map;
|
|
exports.map$1 = map$1;
|
|
exports.setIfUndefined = setIfUndefined;
|
|
//# sourceMappingURL=map-24d263c0.cjs.map
|