56 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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();
 | |
| 	}
 | |
| };
 |