aboutsummaryrefslogtreecommitdiff
path: root/node_modules/mem/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/mem/index.js')
-rw-r--r--node_modules/mem/index.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/node_modules/mem/index.js b/node_modules/mem/index.js
new file mode 100644
index 0000000..aa5a073
--- /dev/null
+++ b/node_modules/mem/index.js
@@ -0,0 +1,55 @@
+'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();
+ }
+};