timed-memoize
Version:
75 lines • 2.96 kB
JavaScript
;
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
function simple(args) {
return args.toString();
}
function argsNotEquals(args1, args2) {
return args1.some(function (arg, index) { return arg !== args2[index]; });
}
function memoized(fn, cache, cleanup, options) {
var _a = options.timeout, timeout = _a === void 0 ? 0 : _a, _b = options.hot, hot = _b === void 0 ? true : _b, _c = options.discardUndefined, discardUndefined = _c === void 0 ? false : _c, _d = options.resolver, resolver = _d === void 0 ? simple : _d, _e = options.one, one = _e === void 0 ? false : _e;
var actualResolver = one ? function () { return 'key'; } : resolver;
var lastArgs = undefined;
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var key = actualResolver(args);
function cleanupCallback() {
lastArgs = undefined;
delete cache[key];
delete cleanup[key];
}
if (!(key in cache) || one && (lastArgs === undefined || argsNotEquals(args, lastArgs))) {
var returnValue = fn.apply(null, arguments);
if (!discardUndefined || typeof returnValue !== 'undefined') {
cache[key] = returnValue;
if (timeout >= 0) {
cleanup[key] = setTimeout(cleanupCallback, timeout);
}
}
}
else if (hot) {
var oldCleanupCallback = cleanup[key];
if (oldCleanupCallback !== undefined) {
clearTimeout(oldCleanupCallback);
}
if (timeout >= 0) {
cleanup[key] = setTimeout(cleanupCallback, timeout);
}
}
lastArgs = args;
return cache[key];
};
}
function timedMemoize(a, b) {
if (typeof a === 'function') {
// Memoized function value
var fn = a;
var options = b || {};
var cache = {};
var cleanup = {};
return memoized(fn, cache, cleanup, options);
}
else if (typeof a === 'object' || arguments.length === 0) {
// Memoized key-value pairs
var options = a || {};
var cache = {};
var cleanup = {};
return memoized(function (x, y) { return y; }, cache, cleanup, __assign({}, options, { resolver: function (args) { return args[0].toString(); }, discardUndefined: true }));
}
else {
throw new Error('Invalid arguments');
}
}
exports.default = timedMemoize;
//# sourceMappingURL=index.js.map