packages/store/src/utils/compose.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
export type StateFn = (...args: any[]) => any;

/**
 * Composes a array of functions from left to right. Example:
 *
 *      compose([fn, final])(state, action);
 *
 * then the funcs have a signature like:
 *
 *      function fn (state, action, next) {
 *          console.log('here', state, action, next);
 *          return next(state, action);
 *      }
 *
 *      function final (state, action) {
 *          console.log('here', state, action);
 *          return state;
 *      }
 *
 * the last function should not call `next`.
 *
 * @ignore
 */
export const compose =
  (funcs: StateFn[]) =>
  (...args: any[]) => {
    const curr = funcs.shift()!;
    return curr(...args, (...nextArgs: any[]) => compose(funcs)(...nextArgs));
  };