Композиция функций
Как с помощью стрелочных функций сделать композицию функций. (НЕ ИСПОЛЬЗУЯ функцию compose). И есть ли возможность это сделать с помощью рест оператора ?
const upperCase = (data) => data.toUpperCase();
const tripleExclaim = (data) => data += '!!!';
const split = (data) => data.split('_');
const join = (data) => data.join(' ');
const copy = (data) => data.repeat(2);
const createComposition = function (copy, join, split, tripleExclaim, upperCase) {
const cmp = (upperCase())=>
};
const result = createComposition(copy, join, split, tripleExclaim, upperCase);
Ответы (1 шт):
Автор решения: OPTIMUS PRIME
→ Ссылка
Гугл говорит, Композицией называют трюк, когда вместо вызовов неразборчивых цепочек функций a(b(c(d(e(f(xx)))))), создают функцию более высокого уровня, которую будет легче использовать function compose(xx) { return a(b(c(d(e(f(xx)))))); }
Есть ли возможность это сделать с помощью рест оператора ?
const upperCase = (data) => data.toUpperCase();
const tripleExclaim = (data) => data += '!!!';
const split = (data) => data.split('_');
const join = (data) => data.join(' ');
const copy = (data) => data.repeat(2);
const fn = createComposition(copy, join, split, tripleExclaim, upperCase);
console.log( fn('a_b') );
console.log( copy(join(split(tripleExclaim(upperCase('a_b'))))) );
/***/
function createComposition(...fn_list) {
return function(...args) {
// При вызове createComposition, эта функция попадает в fn, и именно она
// вызывается при вызове fn('a_b'); Параметр args == массив ['a_b']
let result = fn_list.pop()(...args);
// pop() удаляет последний элемент массива (функцию) и возвращает его же.
// Она вызывается с полученными аргументами.
while (fn_list.length) {
result = fn_list.pop()(result);
}
// Получается цепочка copy(join(split(tripleExclaim(upperCase(...args)))))
return result;
}
};