@augment-vir/common
Version:
A collection of augments, helpers types, functions, and classes for any JavaScript environment.
101 lines (100 loc) • 3.01 kB
JavaScript
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;
}
}
}