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" | |
} |