fb6f24adbd357dd3142e6da5629e48bddf293ff9ceb2c999170da311d6b3dd81c83a62bc5998baea006b47febe4e176b25039b3c0929a54206f0698cfeaf65 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { identity } from './identity';
  2. import { UnaryFunction } from '../types';
  3. export function pipe(): typeof identity;
  4. export function pipe<T, A>(fn1: UnaryFunction<T, A>): UnaryFunction<T, A>;
  5. export function pipe<T, A, B>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>): UnaryFunction<T, B>;
  6. export function pipe<T, A, B, C>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>): UnaryFunction<T, C>;
  7. export function pipe<T, A, B, C, D>(
  8. fn1: UnaryFunction<T, A>,
  9. fn2: UnaryFunction<A, B>,
  10. fn3: UnaryFunction<B, C>,
  11. fn4: UnaryFunction<C, D>
  12. ): UnaryFunction<T, D>;
  13. export function pipe<T, A, B, C, D, E>(
  14. fn1: UnaryFunction<T, A>,
  15. fn2: UnaryFunction<A, B>,
  16. fn3: UnaryFunction<B, C>,
  17. fn4: UnaryFunction<C, D>,
  18. fn5: UnaryFunction<D, E>
  19. ): UnaryFunction<T, E>;
  20. export function pipe<T, A, B, C, D, E, F>(
  21. fn1: UnaryFunction<T, A>,
  22. fn2: UnaryFunction<A, B>,
  23. fn3: UnaryFunction<B, C>,
  24. fn4: UnaryFunction<C, D>,
  25. fn5: UnaryFunction<D, E>,
  26. fn6: UnaryFunction<E, F>
  27. ): UnaryFunction<T, F>;
  28. export function pipe<T, A, B, C, D, E, F, G>(
  29. fn1: UnaryFunction<T, A>,
  30. fn2: UnaryFunction<A, B>,
  31. fn3: UnaryFunction<B, C>,
  32. fn4: UnaryFunction<C, D>,
  33. fn5: UnaryFunction<D, E>,
  34. fn6: UnaryFunction<E, F>,
  35. fn7: UnaryFunction<F, G>
  36. ): UnaryFunction<T, G>;
  37. export function pipe<T, A, B, C, D, E, F, G, H>(
  38. fn1: UnaryFunction<T, A>,
  39. fn2: UnaryFunction<A, B>,
  40. fn3: UnaryFunction<B, C>,
  41. fn4: UnaryFunction<C, D>,
  42. fn5: UnaryFunction<D, E>,
  43. fn6: UnaryFunction<E, F>,
  44. fn7: UnaryFunction<F, G>,
  45. fn8: UnaryFunction<G, H>
  46. ): UnaryFunction<T, H>;
  47. export function pipe<T, A, B, C, D, E, F, G, H, I>(
  48. fn1: UnaryFunction<T, A>,
  49. fn2: UnaryFunction<A, B>,
  50. fn3: UnaryFunction<B, C>,
  51. fn4: UnaryFunction<C, D>,
  52. fn5: UnaryFunction<D, E>,
  53. fn6: UnaryFunction<E, F>,
  54. fn7: UnaryFunction<F, G>,
  55. fn8: UnaryFunction<G, H>,
  56. fn9: UnaryFunction<H, I>
  57. ): UnaryFunction<T, I>;
  58. export function pipe<T, A, B, C, D, E, F, G, H, I>(
  59. fn1: UnaryFunction<T, A>,
  60. fn2: UnaryFunction<A, B>,
  61. fn3: UnaryFunction<B, C>,
  62. fn4: UnaryFunction<C, D>,
  63. fn5: UnaryFunction<D, E>,
  64. fn6: UnaryFunction<E, F>,
  65. fn7: UnaryFunction<F, G>,
  66. fn8: UnaryFunction<G, H>,
  67. fn9: UnaryFunction<H, I>,
  68. ...fns: UnaryFunction<any, any>[]
  69. ): UnaryFunction<T, unknown>;
  70. /**
  71. * pipe() can be called on one or more functions, each of which can take one argument ("UnaryFunction")
  72. * and uses it to return a value.
  73. * It returns a function that takes one argument, passes it to the first UnaryFunction, and then
  74. * passes the result to the next one, passes that result to the next one, and so on.
  75. */
  76. export function pipe(...fns: Array<UnaryFunction<any, any>>): UnaryFunction<any, any> {
  77. return pipeFromArray(fns);
  78. }
  79. /** @internal */
  80. export function pipeFromArray<T, R>(fns: Array<UnaryFunction<T, R>>): UnaryFunction<T, R> {
  81. if (fns.length === 0) {
  82. return identity as UnaryFunction<any, any>;
  83. }
  84. if (fns.length === 1) {
  85. return fns[0];
  86. }
  87. return function piped(input: T): R {
  88. return fns.reduce((prev: any, fn: UnaryFunction<T, R>) => fn(prev), input as any);
  89. };
  90. }