const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)));
const pipe = (...fns) => compose.apply(compose, fns.reverse());
Create the function, composed of three others:
const example = compose(
val => { console.log(1); return `1<${val}>`; },
val => { console.log(2); return `2<${val}>`; },
val => { console.log(3); return `3<${val}>`; }
);
const example2 = pipe(
val => { console.log(1); return `1<${val}>`; },
val => { console.log(2); return `2<${val}>`; },
val => { console.log(3); return `3<${val}>`; }
)
Call the functions:
console.log("Compose");
console.log(example('hello'));
console.log("Pipe");
console.log(example2('hello'));
Console output is:
Compose
3
2
1
"1<2<3<hello>>>"
Pipe
1
2
3
"3<2<1<hello>>>"