function createInMemoryCache(options = { serializable: true }) { // eslint-disable-next-line functional/no-let let cache = {}; return { get(key, defaultValue, events = { miss: () => Promise.resolve(), }) { const keyAsString = JSON.stringify(key); if (keyAsString in cache) { return Promise.resolve(options.serializable ? JSON.parse(cache[keyAsString]) : cache[keyAsString]); } const promise = defaultValue(); const miss = (events && events.miss) || (() => Promise.resolve()); return promise.then((value) => miss(value)).then(() => promise); }, set(key, value) { // eslint-disable-next-line functional/immutable-data cache[JSON.stringify(key)] = options.serializable ? JSON.stringify(value) : value; return Promise.resolve(value); }, delete(key) { // eslint-disable-next-line functional/immutable-data delete cache[JSON.stringify(key)]; return Promise.resolve(); }, clear() { cache = {}; return Promise.resolve(); }, }; } export { createInMemoryCache };