@miyauci/memo
Version:
Memoization tools, TC39 proposal-function-memo implementation
28 lines (27 loc) • 1.1 kB
JavaScript
;
// Copyright © 2023 Tomoki Miyauchi. All rights reserved. MIT license.
// This module is browser compatible.
Object.defineProperty(exports, "__esModule", { value: true });
exports.memo = void 0;
// deno-lint-ignore-file ban-types no-explicit-any
const deps_js_1 = require("./deps.js");
function memo(fn, cache = new WeakMap(), keying) {
const proxy = new Proxy(fn, {
apply(target, thisArg, args) {
const key = (0, deps_js_1.compositeKey)(target, thisArg, ...keying ? keying(args) : args);
const value = (0, deps_js_1.emplace)(cache, key, {
insert: () => Reflect.apply(target, thisArg, args),
});
return value;
},
construct(target, args, newTarget) {
const key = (0, deps_js_1.compositeKey)(target, newTarget, ...keying ? keying(args) : args);
const value = (0, deps_js_1.emplace)(cache, key, {
insert: () => Reflect.construct(target, args, newTarget),
});
return value;
},
});
return proxy;
}
exports.memo = memo;