Функциональный JavaScriptФункции-декораторыhard

Мемоизация функции с произвольным количеством аргументов

Эта задача является продолжением задачи memo.

Допустим, у нас есть чистая функция, которая считает сумму аргументов. Но работает она долго.

function sum(a, b) { // холостой цикл на миллиард шагов // занимает примерно секунду for(let i = 0; i < 1e9; i++); return a + b; } sum(2, 3) === 5 // ≈ 1s

Ваша задача реализовать функцию-декоратор memo:

const mSum = memo(sum); mSum(1, 1) === 2 // ≈ 1s mSum(1, 1) === 2 // ≈ 0.001s mSum(2, 4) === 6 // ≈ 1s mSum(1, 1) === 2 // ≈ 0.001s mSum(2, 4) === 6 // ≈ 0.001s

Функция то функция fn (аргумент memo) может принимать произвольное количество аргументов. Аргументы могут быть любого типа. Например, числа, строки, объекты или функции.

Может быть и такая функция:

const sum = (...args) => args.reduce((a, b) => a + b, 0); const mSum = memo(sum); mSum(1, 1) === 2 // ≈ 1s mSum(2, 4) === 6 // ≈ 1s mSum(1, 1) === 2 // ≈ 0.001s mSum(1) === 1 // ≈ 1s mSum(2, 4) === 6 // ≈ 0.001s mSum(1) === 1 // ≈ 0.001s