You've already forked Epicnabbo-Catalogus-Updated-Daily
40 lines
893 B
JavaScript
40 lines
893 B
JavaScript
'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;
|
|
}
|