Skip to content

Instantly share code, notes, and snippets.

@rkatic
Last active May 30, 2021 10:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rkatic/e941ee28eb4e4072ebbe9d696fdfb7af to your computer and use it in GitHub Desktop.
Save rkatic/e941ee28eb4e4072ebbe9d696fdfb7af to your computer and use it in GitHub Desktop.
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"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment