Files
lodash/flow.js
2017-01-11 08:11:00 -08:00

40 lines
991 B
JavaScript

/**
* Creates a function that returns the result of invoking the given functions
* with the `this` binding of the created function, where each successive
* invocation is supplied the return value of the previous.
*
* @since 3.0.0
* @category Util
* @param {Function[]} [funcs] The functions to invoke.
* @returns {Function} Returns the new composite function.
* @see flowRight
* @example
*
* function square(n) {
* return n * n;
* }
*
* const addSquare = flow([add, square]);
* addSquare(1, 2);
* // => 9
*/
function flow(funcs) {
const length = funcs ? funcs.length : 0;
let index = length;
while (index--) {
if (typeof funcs[index] != 'function') {
throw new TypeError('Expected a function');
}
}
return function(...args) {
let index = 0;
let result = length ? funcs[index].apply(this, args) : args[0];
while (++index < length) {
result = funcs[index].call(this, result);
}
return result;
};
}
export default flow;