1import { sourceT as Source } from '../Wonka_types.gen';
2
3interface UnaryFn<T, R> {
4 (source: T): R;
5}
6
7/* pipe definitions for source + operators composition */
8
9function pipe<T, A>(source: Source<T>, op1: UnaryFn<Source<T>, Source<A>>): Source<A>;
10
11function pipe<T, A, B>(
12 source: Source<T>,
13 op1: UnaryFn<Source<T>, Source<A>>,
14 op2: UnaryFn<Source<A>, Source<B>>
15): Source<B>;
16
17function pipe<T, A, B, C>(
18 source: Source<T>,
19 op1: UnaryFn<Source<T>, Source<A>>,
20 op2: UnaryFn<Source<A>, Source<B>>,
21 op3: UnaryFn<Source<B>, Source<C>>
22): Source<C>;
23
24function pipe<T, A, B, C, D>(
25 source: Source<T>,
26 op1: UnaryFn<Source<T>, Source<A>>,
27 op2: UnaryFn<Source<A>, Source<B>>,
28 op3: UnaryFn<Source<B>, Source<C>>,
29 op4: UnaryFn<Source<C>, Source<D>>
30): Source<D>;
31
32function pipe<T, A, B, C, D, E>(
33 source: Source<T>,
34 op1: UnaryFn<Source<T>, Source<A>>,
35 op2: UnaryFn<Source<A>, Source<B>>,
36 op3: UnaryFn<Source<B>, Source<C>>,
37 op4: UnaryFn<Source<C>, Source<D>>,
38 op5: UnaryFn<Source<D>, Source<E>>
39): Source<E>;
40
41function pipe<T, A, B, C, D, E, F>(
42 source: Source<T>,
43 op1: UnaryFn<Source<T>, Source<A>>,
44 op2: UnaryFn<Source<A>, Source<B>>,
45 op3: UnaryFn<Source<B>, Source<C>>,
46 op4: UnaryFn<Source<C>, Source<D>>,
47 op5: UnaryFn<Source<D>, Source<E>>,
48 op6: UnaryFn<Source<E>, Source<F>>
49): Source<F>;
50
51function pipe<T, A, B, C, D, E, F, G>(
52 source: Source<T>,
53 op1: UnaryFn<Source<T>, Source<A>>,
54 op2: UnaryFn<Source<A>, Source<B>>,
55 op3: UnaryFn<Source<B>, Source<C>>,
56 op4: UnaryFn<Source<C>, Source<D>>,
57 op5: UnaryFn<Source<D>, Source<E>>,
58 op6: UnaryFn<Source<E>, Source<F>>,
59 op7: UnaryFn<Source<F>, Source<G>>
60): Source<G>;
61
62function pipe<T, A, B, C, D, E, F, G, H>(
63 source: Source<T>,
64 op1: UnaryFn<Source<T>, Source<A>>,
65 op2: UnaryFn<Source<A>, Source<B>>,
66 op3: UnaryFn<Source<B>, Source<C>>,
67 op4: UnaryFn<Source<C>, Source<D>>,
68 op5: UnaryFn<Source<D>, Source<E>>,
69 op6: UnaryFn<Source<E>, Source<F>>,
70 op7: UnaryFn<Source<F>, Source<G>>,
71 op8: UnaryFn<Source<G>, Source<H>>
72): Source<H>;
73
74/* pipe definitions for source + operators + consumer composition */
75
76function pipe<T, R>(source: Source<T>, consumer: UnaryFn<Source<T>, R>): R;
77
78function pipe<T, A, R>(
79 source: Source<T>,
80 op1: UnaryFn<Source<T>, Source<A>>,
81 consumer: UnaryFn<Source<A>, R>
82): R;
83
84function pipe<T, A, B, R>(
85 source: Source<T>,
86 op1: UnaryFn<Source<T>, Source<A>>,
87 op2: UnaryFn<Source<A>, Source<B>>,
88 consumer: UnaryFn<Source<B>, R>
89): R;
90
91function pipe<T, A, B, C, R>(
92 source: Source<T>,
93 op1: UnaryFn<Source<T>, Source<A>>,
94 op2: UnaryFn<Source<A>, Source<B>>,
95 op3: UnaryFn<Source<B>, Source<C>>,
96 consumer: UnaryFn<Source<C>, R>
97): R;
98
99function pipe<T, A, B, C, D, R>(
100 source: Source<T>,
101 op1: UnaryFn<Source<T>, Source<A>>,
102 op2: UnaryFn<Source<A>, Source<B>>,
103 op3: UnaryFn<Source<B>, Source<C>>,
104 op4: UnaryFn<Source<C>, Source<D>>,
105 consumer: UnaryFn<Source<D>, R>
106): R;
107
108function pipe<T, A, B, C, D, E, R>(
109 source: Source<T>,
110 op1: UnaryFn<Source<T>, Source<A>>,
111 op2: UnaryFn<Source<A>, Source<B>>,
112 op3: UnaryFn<Source<B>, Source<C>>,
113 op4: UnaryFn<Source<C>, Source<D>>,
114 op5: UnaryFn<Source<D>, Source<E>>,
115 consumer: UnaryFn<Source<E>, R>
116): R;
117
118function pipe<T, A, B, C, D, E, F, R>(
119 source: Source<T>,
120 op1: UnaryFn<Source<T>, Source<A>>,
121 op2: UnaryFn<Source<A>, Source<B>>,
122 op3: UnaryFn<Source<B>, Source<C>>,
123 op4: UnaryFn<Source<C>, Source<D>>,
124 op5: UnaryFn<Source<D>, Source<E>>,
125 op6: UnaryFn<Source<E>, Source<F>>,
126 consumer: UnaryFn<Source<F>, R>
127): R;
128
129function pipe<T, A, B, C, D, E, F, G, R>(
130 source: Source<T>,
131 op1: UnaryFn<Source<T>, Source<A>>,
132 op2: UnaryFn<Source<A>, Source<B>>,
133 op3: UnaryFn<Source<B>, Source<C>>,
134 op4: UnaryFn<Source<C>, Source<D>>,
135 op5: UnaryFn<Source<D>, Source<E>>,
136 op6: UnaryFn<Source<E>, Source<F>>,
137 op7: UnaryFn<Source<F>, Source<G>>,
138 consumer: UnaryFn<Source<G>, R>
139): R;
140
141function pipe<T, A, B, C, D, E, F, G, H, R>(
142 source: Source<T>,
143 op1: UnaryFn<Source<T>, Source<A>>,
144 op2: UnaryFn<Source<A>, Source<B>>,
145 op3: UnaryFn<Source<B>, Source<C>>,
146 op4: UnaryFn<Source<C>, Source<D>>,
147 op5: UnaryFn<Source<D>, Source<E>>,
148 op6: UnaryFn<Source<E>, Source<F>>,
149 op7: UnaryFn<Source<F>, Source<G>>,
150 op8: UnaryFn<Source<G>, Source<H>>,
151 consumer: UnaryFn<Source<H>, R>
152): R;
153
154function pipe() {
155 let x = arguments[0];
156 for (let i = 1, l = arguments.length; i < l; i++)
157 x = arguments[i](x);
158 return x;
159}
160
161export { pipe };