UNPKG

@miyauci/memo

Version:

Memoization tools, TC39 proposal-function-memo implementation

28 lines (27 loc) 1.1 kB
"use strict"; // 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;