aboutsummaryrefslogtreecommitdiff
path: root/node_modules/mem/index.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-08-14 05:01:11 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-08-14 05:02:09 +0200
commit363723fc84f7b8477592e0105aeb331ec9a017af (patch)
tree29f92724f34131bac64d6a318dd7e30612e631c7 /node_modules/mem/index.js
parent5634e77ad96bfe1818f6b6ee70b7379652e5487f (diff)
node_modules
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 000000000..aa5a07398
--- /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();
+ }
+};