UNPKG

@augment-vir/common

Version:

A collection of augments, helpers types, functions, and classes for any JavaScript environment.

101 lines (100 loc) 3.01 kB
import { check } from '@augment-vir/assert'; import { ensureError } from '@augment-vir/core'; /** * Given an map, tries to get the given key in that map. If the key is not in that map, then the * given `createCallback` is used to create a new value which is then stored in the given map and * returned. Automatically handles an async `createCallback`. * * @category Object * @category Package : @augment-vir/common * @example * * ```ts * // instead of doing this * if (!myMap.get(myKey)) { * myMap.set(myKey, {}); * } * myMap.get(myKey)![nextKey] = 'some value'; * * // do this * getOrSetInObject(myMap, myKey, () => { * return {}; * }); * ``` * * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common) */ export function getOrSetFromMap(map, key, createCallback) { const mapKey = key; if (map.has(mapKey)) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return map.get(mapKey); } else { const createdValue = createCallback(); if (check.isPromise(createdValue)) { return new Promise(async (resolve, reject) => { try { const awaitedValue = await createdValue; map.set(mapKey, awaitedValue); resolve(awaitedValue); } catch (error) { reject(ensureError(error)); } }); } else { map.set(mapKey, createdValue); return createdValue; } } } /** * Given an object, tries to get the given key in that object. If the key is not in that object, * then the given `createCallback` is used to create a new value which is then stored in the given * object and returned. Automatically handles an async `createCallback`. * * @category Object * @category Package : @augment-vir/common * @example * * ```ts * // instead of doing this * if (!myObject[myKey]) { * myObject[myKey] = {}; * } * myObject[myKey]![nextKey] = 'some value'; * * // do this * getOrSetInObject(myObject, myKey, () => { * return {}; * }); * ``` * * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common) */ export function getOrSet(originalObject, key, createCallback) { if (key in originalObject) { return originalObject[key]; } else { const createdValue = createCallback(); if (check.isPromise(createdValue)) { return new Promise(async (resolve, reject) => { try { const awaitedValue = await createdValue; originalObject[key] = awaitedValue; resolve(awaitedValue); } catch (error) { reject(ensureError(error)); } }); } else { originalObject[key] = createdValue; return createdValue; } } }