Spaces:
Runtime error
Runtime error
; | |
// | |
// Main | |
// | |
Object.defineProperty(exports, "__esModule", { value: true }); | |
exports.strategies = void 0; | |
function memoize(fn, options) { | |
var cache = options && options.cache ? options.cache : cacheDefault; | |
var serializer = options && options.serializer ? options.serializer : serializerDefault; | |
var strategy = options && options.strategy ? options.strategy : strategyDefault; | |
return strategy(fn, { | |
cache: cache, | |
serializer: serializer, | |
}); | |
} | |
exports.default = memoize; | |
// | |
// Strategy | |
// | |
function isPrimitive(value) { | |
return (value == null || typeof value === 'number' || typeof value === 'boolean'); // || typeof value === "string" 'unsafe' primitive for our needs | |
} | |
function monadic(fn, cache, serializer, arg) { | |
var cacheKey = isPrimitive(arg) ? arg : serializer(arg); | |
var computedValue = cache.get(cacheKey); | |
if (typeof computedValue === 'undefined') { | |
computedValue = fn.call(this, arg); | |
cache.set(cacheKey, computedValue); | |
} | |
return computedValue; | |
} | |
function variadic(fn, cache, serializer) { | |
var args = Array.prototype.slice.call(arguments, 3); | |
var cacheKey = serializer(args); | |
var computedValue = cache.get(cacheKey); | |
if (typeof computedValue === 'undefined') { | |
computedValue = fn.apply(this, args); | |
cache.set(cacheKey, computedValue); | |
} | |
return computedValue; | |
} | |
function assemble(fn, context, strategy, cache, serialize) { | |
return strategy.bind(context, fn, cache, serialize); | |
} | |
function strategyDefault(fn, options) { | |
var strategy = fn.length === 1 ? monadic : variadic; | |
return assemble(fn, this, strategy, options.cache.create(), options.serializer); | |
} | |
function strategyVariadic(fn, options) { | |
return assemble(fn, this, variadic, options.cache.create(), options.serializer); | |
} | |
function strategyMonadic(fn, options) { | |
return assemble(fn, this, monadic, options.cache.create(), options.serializer); | |
} | |
// | |
// Serializer | |
// | |
var serializerDefault = function () { | |
return JSON.stringify(arguments); | |
}; | |
// | |
// Cache | |
// | |
function ObjectWithoutPrototypeCache() { | |
this.cache = Object.create(null); | |
} | |
ObjectWithoutPrototypeCache.prototype.get = function (key) { | |
return this.cache[key]; | |
}; | |
ObjectWithoutPrototypeCache.prototype.set = function (key, value) { | |
this.cache[key] = value; | |
}; | |
var cacheDefault = { | |
create: function create() { | |
// @ts-ignore | |
return new ObjectWithoutPrototypeCache(); | |
}, | |
}; | |
exports.strategies = { | |
variadic: strategyVariadic, | |
monadic: strategyMonadic, | |
}; | |