48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| var cacheProp = Symbol.for('[memoize]');
 | |
| function Memoize(keyBuilder) {
 | |
|     return function (_, propertyKey, descriptor) {
 | |
|         if (descriptor.value != null) {
 | |
|             descriptor.value = memoize(propertyKey, descriptor.value, keyBuilder || (function (v) { return v; }));
 | |
|         }
 | |
|         else if (descriptor.get != null) {
 | |
|             descriptor.get = memoize(propertyKey, descriptor.get, keyBuilder || (function () { return propertyKey; }));
 | |
|         }
 | |
|     };
 | |
| }
 | |
| exports.Memoize = Memoize;
 | |
| function ensureCache(target, reset) {
 | |
|     if (reset === void 0) { reset = false; }
 | |
|     if (reset || !target[cacheProp]) {
 | |
|         Object.defineProperty(target, cacheProp, {
 | |
|             value: Object.create(null),
 | |
|             configurable: true,
 | |
|         });
 | |
|     }
 | |
|     return target[cacheProp];
 | |
| }
 | |
| function ensureChildCache(target, key, reset) {
 | |
|     if (reset === void 0) { reset = false; }
 | |
|     var dict = ensureCache(target);
 | |
|     if (reset || !dict[key]) {
 | |
|         dict[key] = new Map();
 | |
|     }
 | |
|     return dict[key];
 | |
| }
 | |
| function memoize(namespace, func, keyBuilder) {
 | |
|     return function () {
 | |
|         var args = [];
 | |
|         for (var _i = 0; _i < arguments.length; _i++) {
 | |
|             args[_i] = arguments[_i];
 | |
|         }
 | |
|         var cache = ensureChildCache(this, namespace);
 | |
|         var key = keyBuilder.apply(this, args);
 | |
|         if (cache.has(key))
 | |
|             return cache.get(key);
 | |
|         var res = func.apply(this, args);
 | |
|         cache.set(key, res);
 | |
|         return res;
 | |
|     };
 | |
| }
 |