| 'use strict'; |
| const mimicFn = require('mimic-fn'); |
| |
| const cacheStore = new WeakMap(); |
| |
| const defaultCacheKey = function (x) { |
| if (arguments.length === 1 && (x === null || x === undefined || (typeof x !== 'function' && typeof x !== 'object'))) { |
| return x; |
| } |
| |
| return JSON.stringify(arguments); |
| }; |
| |
| module.exports = (fn, opts) => { |
| opts = Object.assign({ |
| cacheKey: defaultCacheKey, |
| cache: new Map() |
| }, opts); |
| |
| const memoized = function () { |
| const cache = cacheStore.get(memoized); |
| const key = opts.cacheKey.apply(null, arguments); |
| |
| if (cache.has(key)) { |
| const c = cache.get(key); |
| |
| if (typeof opts.maxAge !== 'number' || Date.now() < c.maxAge) { |
| return c.data; |
| } |
| } |
| |
| const ret = fn.apply(null, arguments); |
| |
| cache.set(key, { |
| data: ret, |
| maxAge: Date.now() + (opts.maxAge || 0) |
| }); |
| |
| return ret; |
| }; |
| |
| mimicFn(memoized, fn); |
| |
| cacheStore.set(memoized, opts.cache); |
| |
| return memoized; |
| }; |
| |
| module.exports.clear = fn => { |
| const cache = cacheStore.get(fn); |
| |
| if (cache && typeof cache.clear === 'function') { |
| cache.clear(); |
| } |
| }; |