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

Мемоизация функции с одним аргументом

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

function double(x) { // холостой цикл на миллиард шагов // занимает примерно секунду for(let i = 0; i < 1e9; i++); return x * 2; } console.time("10"); console.log(double(10)); 20 console.timeEnd("10"); // ≈ 1s

Ваша задача реализовать функцию-декоратор memo. Эта функция принимает один аргумент fn и возвращает новую функцию, которая делает то же самое, но не вычисляет результат для тех же аргументов повторно.

const mDouble = memo(double); console.time("A"); console.log(mDouble(1)) // 2 console.timeEnd("A"); // ≈ 1s console.time("B"); console.log(mDouble(1)) // 2 console.timeEnd("B"); // ≈ 0.001s console.time("C"); console.log(mDouble(3)) // 6 console.timeEnd("C"); // ≈ 1s console.time("D"); console.log(mDouble(1)) // 2 console.timeEnd("D"); // ≈ 0.001s console.time("E"); console.log(mDouble(3)) // 6 console.timeEnd("E"); // ≈ 0.001s

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

В задаче memo-advanced необходимо реализовать такую же функцию memo, но fn может принимать произвольное количество аргументов.