Ответ 1
Вы можете взять Map
качестве кэша и использовать вложенные карты для всех следующих аргументов.
Этот кеш работает для произвольного количества аргументов и повторно использует значения из предыдущих вызовов.
Это работает, беря карри функцию и опциональную Map
. Если карта не указана, создается новая карта, которая служит базовым кэшем для всех других вызовов возвращаемого замыкания или конечного результата.
Внутренняя функция принимает один аргумент и проверяет, есть ли это значение на карте.
-
Если нет, вызовите карри функцию и проверьте возвращаемое значение
-
если функция, создайте новое замыкание над функцией и новую карту,
-
если функция не принимает результат,
в качестве значения для нового элемента карты.
-
-
Наконец, верните значение с карты.
const
cache = (fn, map = new Map) => arg => {
console.log(arg, map.has(arg) ? 'in cache' : 'not in cache');
if (!map.has(arg)) {
var value = fn(arg);
map.set(arg, typeof value === 'function' ? cache(value, new Map) : value);
}
return map.get(arg);
},
f = a => b => c => a * b * c, // curried function
g = cache(f); // cache function f, return function with closure
console.log(g(1)(2)(5)); // not not not 10
console.log(g(1)(3)(4)); // in not not 12
console.log(g(4)(2)(3)); // not not not 24
console.log(g(1)(2)(6)); // in in not 12
console.log(g(4)(2)(3)); // in in in 24
.as-console-wrapper { max-height: 100% !important; top: 0; }