'use strict';
const Aigle = require('./aigle');
module.exports = flow;
/**
* @param {Function[]} funcs
* @return {Function} Returns the new composite function
* @example
* const add = (a, b) => Aigle.delay(10, a + b);
* const square = n => Aigle.delay(10, n * n);
* const addSquare = Aigle.flow(add, square);
* return addSquare(1, 2).then(value => {
* console.log(value); // 9
* });
*/
function flow(...funcs) {
const [handler = thru, ...handlers] = flatArray(funcs);
return (...args) =>
Aigle.resolve(handler(...args)).then((data) =>
Aigle.reduce(handlers, (acc, func) => func(acc), data)
);
}
function thru(arg) {
return arg;
}
function flatArray(args) {
const l = args.length;
const array = [];
let i = -1;
while (++i < l) {
const arg = args[i];
Array.isArray(arg) ? array.push(...arg) : array.push(arg);
}
return array;
}