/** * Composes single-argument functions from right to left. The rightmost * function can take multiple arguments as it provides the signature for the * resulting composite function. * * References:https://github.com/reduxjs/redux/blob/master/src/compose.ts * * @param funcs The functions to compose. * @returns A function obtained by composing the argument functions from right * to left. For example, `compose(f, g, h)` is identical to doing * `(...args) => f(g(h(...args)))`. */ const compose = (...funcs: Array<(a: T) => T>) => { if (funcs.length === 0) { // infer the argument type so it is usable in inference down the line return (arg: T) => arg } if (funcs.length === 1) { return funcs[0] } return funcs.reduce( (a, b) => (...args) => a(b(...args)) ) } export default compose