Композиция функций

Как с помощью стрелочных функций сделать композицию функций. (НЕ ИСПОЛЬЗУЯ функцию 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;
  }
};

→ Ссылка