npm i gist:e941ee28eb4e4072ebbe9d696fdfb7af
const { memoArgs, memoLastArgs } = require('memo-args')
memoArgs(func)
memoLastArgs(func)| 'use strict' | |
| function memoArgs (fn) { | |
| const NONE = {} | |
| const root = { | |
| result: NONE, | |
| byVal: null, | |
| byRef: null, | |
| } | |
| return (...args) => { | |
| let node = root | |
| for (let i = 0; i < args.length; ++i) { | |
| const key = args[i] | |
| const cache = key === Object(key) | |
| ? node.byRef || (node.byRef = new WeakMap()) | |
| : node.byVal || (node.byVal = new Map()) | |
| node = cache.get(key) | |
| if (!node) { | |
| node = { | |
| result: NONE, | |
| byVal: null, | |
| byRef: null, | |
| } | |
| cache.set(key, node) | |
| } | |
| } | |
| if (node.result === NONE) { | |
| node.result = fn(...args) | |
| } | |
| return node.result | |
| } | |
| } | |
| function memoLastArgs (fn) { | |
| let lastArgs = [{}] | |
| let lastResult | |
| const isSameAsLastArg = (arg, i) => arg === lastArgs[i] | |
| return (...args) => { | |
| if (args.length !== lastArgs.length || !args.every(isSameAsLastArg)) { | |
| lastResult = fn(...args) | |
| lastArgs = args | |
| } | |
| return lastResult | |
| } | |
| } | |
| module.exports = { | |
| memoArgs, | |
| memoLastArgs, | |
| } |
| { | |
| "version": "0.0.1", | |
| "name": "memo-args" | |
| } |