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

Compose

Пусть нам даны функции, принимающие один аргумент:

const double = x => x * 2; const cube = x => x ** 3; const inc = x => x + 1;

Допустим, мы часто выполняем какую-то операцию, требующую последовательного выполнения этих функций.

const res0 = double(cube(inc(0))); // 2 const res1 = double(cube(inc(1))); // 16 const res2 = double(cube(inc(2))); // 54

Функция compose позволяет создать функцию, которая позволяет зафиксировать последовательность этих действий и выполнять ее для разных аргументов.

const foo = compose(double, cube, inc); console.log(foo(0)); // 2 console.log(foo(1)); // 16 console.log(foo(2)); // 54

Мы можем работать не только с функциями, принимающими и возвращающими числа.

const fill = x => Array(3).fill(x); const repeat = x => x.repeat(5); const last = arr => arr.at(-1); const foo = compose(fill, repeat, last); console.log(foo(["a", "b", "c"])); // ["ccccc", "ccccc", "ccccc"]

Для пустого набора аргументов compose возвращает функцию identity, которая возвращает свой аргумент:

const foo = compose(); console.log(foo("a")); // "a" console.log(foo(5)); // 5