@naturalcycles/js-lib
Version:
Standard library for universal (browser + Node.js) javascript
36 lines (35 loc) • 991 B
JavaScript
import { MISS } from '../types.js';
import { jsonMemoSerializer, MapMemoCache } from './memo.util.js';
/**
* @experimental
*/
export function _memoFnAsync(fn, opt) {
const { logger = console, cacheFactory = () => new MapMemoCache(), cacheKeyFn = jsonMemoSerializer, } = opt;
const cache = cacheFactory();
const memoizedFn = async function (...args) {
const ctx = this;
const cacheKey = cacheKeyFn(args);
let value;
try {
value = await cache.get(cacheKey);
}
catch (err) {
logger.error(err);
}
if (value !== MISS) {
return value;
}
value = await fn.apply(ctx, args);
void (async () => {
try {
await cache.set(cacheKey, value);
}
catch (err) {
logger.error(err);
}
})();
return value;
};
Object.assign(memoizedFn, { cache });
return memoizedFn;
}