Source: function/pipe.js

/**
 * Takes a variable list of functions and returns a new function
 * that is a composition of all the functions that were passed.
 * The functions are called left-to-right.
 * The left-most function may have any arity, while the rest must be unary.
 * An example with three functions (f, g, h) => (...args) => f(g(h(...args)))
 *
 * @param  {...function} funcs
 * @returns {function}
 */
const pipe = (...funcs) => (...args) => {
  if (funcs.length === 0) {
    throw new Error("No functions provided.");
  }

  const result = funcs.reduce(
    (prevResult, currentFn) => [currentFn(...prevResult)],
    args
  );

  return result[0];
};

export default pipe;