annotate src/main/java/fj/Function.java @ 0:fe80c1edf1be

add getLoop
author tatsuki
date Fri, 20 Mar 2015 21:04:03 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1 package fj;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
2
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
3 import fj.data.Option;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
4
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
5 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
6 * Transformations on functions.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
7 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
8 * @version %build.number%
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
9 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
10 public final class Function {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
11 private Function() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
12 throw new UnsupportedOperationException();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
13 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
14
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
15 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
16 * Function application with the arguments flipped.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
17 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
18 * @param a The value to apply the function to.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
19 * @return A function that is partially-applied to the given value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
20 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
21 public static <A, B> F<F<A, B>, B> apply(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
22 return new F<F<A, B>, B>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
23 public B f(final F<A, B> k) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
24 return k.f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
25 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
26 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
27 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
28
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
29 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
30 * Function composition.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
31 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
32 * @return A function that composes two functions to produce a new function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
33 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
34 public static <A, B, C> F<F<B, C>, F<F<A, B>, F<A, C>>> compose() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
35 return new F<F<B, C>, F<F<A, B>, F<A, C>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
36 public F<F<A, B>, F<A, C>> f(final F<B, C> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
37 return new F<F<A, B>, F<A, C>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
38 public F<A, C> f(final F<A, B> g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
39 return compose(f, g);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
40 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
41 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
42 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
43 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
44 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
45
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
46 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
47 * Function composition.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
48 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
49 * @param f A function to compose with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
50 * @param g A function to compose with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
51 * @return A function that is the composition of the given arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
52 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
53 public static <A, B, C> F<A, C> compose(final F<B, C> f, final F<A, B> g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
54 return new F<A, C>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
55 public C f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
56 return f.f(g.f(a));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
57 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
58 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
59 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
60
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
61 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
62 * Function composition.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
63 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
64 * @param f A function to compose with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
65 * @param g A function to compose with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
66 * @return A function that is the composition of the given arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
67 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
68 public static <A, B, C, D> F<A, F<B, D>> compose2(final F<C, D> f, final F<A, F<B, C>> g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
69 return new F<A, F<B, D>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
70 public F<B, D> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
71 return new F<B, D>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
72 public D f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
73 return f.f(g.f(a).f(b));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
74 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
75 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
76 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
77 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
78 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
79
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
80
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
81 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
82 * Function composition flipped.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
83 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
84 * @return A function that composes two functions to produce a new function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
85 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
86 public static <A, B, C> F<F<A, B>, F<F<B, C>, F<A, C>>> andThen() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
87 return new F<F<A, B>, F<F<B, C>, F<A, C>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
88 public F<F<B, C>, F<A, C>> f(final F<A, B> g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
89 return new F<F<B, C>, F<A, C>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
90 public F<A, C> f(final F<B, C> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
91 return Function.andThen(g, f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
92 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
93 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
94 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
95 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
96 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
97
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
98 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
99 * Function composition flipped.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
100 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
101 * @param g A function to compose with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
102 * @param f A function to compose with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
103 * @return A function that is the composition of the given arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
104 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
105 public static <A, B, C> F<A, C> andThen(final F<A, B> g, final F<B, C> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
106 return new F<A, C>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
107 public C f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
108 return f.f(g.f(a));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
109 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
110 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
111 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
112
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
113 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
114 * The identity transformation.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
115 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
116 * @return The identity transformation.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
117 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
118 public static <A> F<A, A> identity() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
119 return new F<A, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
120 public A f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
121 return a;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
122 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
123 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
124 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
125
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
126 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
127 * Returns a function that given an argument, returns a function that ignores its argument.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
128 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
129 * @return A function that given an argument, returns a function that ignores its argument.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
130 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
131 public static <A, B> F<B, F<A, B>> constant() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
132 return new F<B, F<A, B>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
133 public F<A, B> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
134 return constant(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
135 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
136 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
137 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
138
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
139 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
140 * Returns a function that ignores its argument to constantly produce the given value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
141 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
142 * @param b The value to return when the returned function is applied.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
143 * @return A function that ignores its argument to constantly produce the given value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
144 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
145 public static <A, B> F<A, B> constant(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
146 return new F<A, B>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
147 public B f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
148 return b;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
149 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
150 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
151 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
152
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
153 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
154 * Simultaneously covaries and contravaries a function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
155 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
156 * @param f The function to vary.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
157 * @return A co- and contravariant function that invokes f on its argument.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
158 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
159 public static <A, B> F<A, B> vary(final F<? super A, ? extends B> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
160 return new F<A, B>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
161 public B f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
162 return f.f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
163 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
164 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
165 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
166
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
167 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
168 * Simultaneously covaries and contravaries a function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
169 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
170 * @return A function that varies and covaries a function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
171 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
172 public static <C, A extends C, B, D extends B> F<F<C, D>, F<A, B>> vary() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
173 return new F<F<C, D>, F<A, B>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
174 public F<A, B> f(final F<C, D> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
175 return Function.<A, B>vary(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
176 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
177 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
178 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
179
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
180 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
181 * Function argument flipping.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
182 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
183 * @return A function that takes a function and flips its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
184 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
185 public static <A, B, C> F<F<A, F<B, C>>, F<B, F<A, C>>> flip() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
186 return new F<F<A, F<B, C>>, F<B, F<A, C>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
187 public F<B, F<A, C>> f(final F<A, F<B, C>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
188 return flip(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
189 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
190 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
191 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
192
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
193 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
194 * Function argument flipping.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
195 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
196 * @param f The function to flip.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
197 * @return The given function flipped.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
198 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
199 public static <A, B, C> F<B, F<A, C>> flip(final F<A, F<B, C>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
200 return new F<B, F<A, C>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
201 public F<A, C> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
202 return new F<A, C>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
203 public C f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
204 return f.f(a).f(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
205 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
206 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
207 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
208 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
209 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
210
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
211 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
212 * Function argument flipping.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
213 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
214 * @param f The function to flip.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
215 * @return The given function flipped.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
216 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
217 public static <A, B, C> F2<B, A, C> flip(final F2<A, B, C> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
218 return new F2<B, A, C>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
219 public C f(final B b, final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
220 return f.f(a, b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
221 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
222 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
223 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
224
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
225 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
226 * Function argument flipping.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
227 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
228 * @return A function that flips the arguments of a given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
229 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
230 public static <A, B, C> F<F2<A, B, C>, F2<B, A, C>> flip2() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
231 return new F<F2<A, B, C>, F2<B, A, C>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
232 public F2<B, A, C> f(final F2<A, B, C> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
233 return flip(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
234 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
235 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
236 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
237
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
238 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
239 * Return a function that inspects the argument of the given function for a <code>null</code> value and if so, does
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
240 * not apply the value, instead returning an empty optional value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
241 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
242 * @param f The function to check for a <code>null</code> argument.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
243 * @return A function that inspects the argument of the given function for a <code>null</code> value and if so, does
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
244 * not apply the value, instead returning an empty optional value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
245 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
246 public static <A, B> F<A, Option<B>> nullable(final F<A, B> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
247 return new F<A, Option<B>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
248 public Option<B> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
249 return a == null ? Option.<B>none() : Option.some(f.f(a));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
250 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
251 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
252 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
253
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
254 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
255 * Curry a function of arity-2.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
256 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
257 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
258 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
259 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
260 public static <A, B, C> F<A, F<B, C>> curry(final F2<A, B, C> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
261 return new F<A, F<B, C>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
262 public F<B, C> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
263 return new F<B, C>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
264 public C f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
265 return f.f(a, b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
266 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
267 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
268 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
269 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
270 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
271
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
272 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
273 * Curry a function of arity-2.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
274 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
275 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
276 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
277 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
278 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
279 public static <A, B, C> F<B, C> curry(final F2<A, B, C> f, final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
280 return curry(f).f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
281 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
282
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
283 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
284 * Uncurry a function of arity-2.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
285 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
286 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
287 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
288 public static <A, B, C> F<F<A, F<B, C>>, F2<A, B, C>> uncurryF2() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
289 return new F<F<A, F<B, C>>, F2<A, B, C>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
290 public F2<A, B, C> f(final F<A, F<B, C>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
291 return uncurryF2(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
292 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
293 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
294 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
295
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
296 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
297 * Uncurry a function of arity-2.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
298 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
299 * @param f The function to uncurry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
300 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
301 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
302 public static <A, B, C> F2<A, B, C> uncurryF2(final F<A, F<B, C>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
303 return new F2<A, B, C>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
304 public C f(final A a, final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
305 return f.f(a).f(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
306 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
307 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
308 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
309
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
310 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
311 * Curry a function of arity-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
312 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
313 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
314 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
315 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
316 public static <A, B, C, D> F<A, F<B, F<C, D>>> curry(final F3<A, B, C, D> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
317 return new F<A, F<B, F<C, D>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
318 public F<B, F<C, D>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
319 return new F<B, F<C, D>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
320 public F<C, D> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
321 return new F<C, D>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
322 public D f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
323 return f.f(a, b, c);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
324 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
325 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
326 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
327 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
328 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
329 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
330 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
331
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
332 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
333 * Curry a function of arity-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
334 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
335 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
336 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
337 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
338 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
339 public static <A, B, C, D> F<B, F<C, D>> curry(final F3<A, B, C, D> f, final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
340 return curry(f).f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
341 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
342
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
343 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
344 * Curry a function of arity-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
345 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
346 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
347 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
348 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
349 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
350 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
351 public static <A, B, C, D> F<C, D> curry(final F3<A, B, C, D> f, final A a, final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
352 return curry(f, a).f(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
353 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
354
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
355 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
356 * Uncurry a function of arity-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
357 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
358 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
359 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
360 public static <A, B, C, D> F<F<A, F<B, F<C, D>>>, F3<A, B, C, D>> uncurryF3() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
361 return new F<F<A, F<B, F<C, D>>>, F3<A, B, C, D>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
362 public F3<A, B, C, D> f(final F<A, F<B, F<C, D>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
363 return uncurryF3(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
364 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
365 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
366 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
367
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
368 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
369 * Uncurry a function of arity-3.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
370 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
371 * @param f The function to uncurry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
372 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
373 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
374 public static <A, B, C, D> F3<A, B, C, D> uncurryF3(final F<A, F<B, F<C, D>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
375 return new F3<A, B, C, D>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
376 public D f(final A a, final B b, final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
377 return f.f(a).f(b).f(c);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
378 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
379 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
380 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
381
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
382 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
383 * Curry a function of arity-4.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
384 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
385 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
386 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
387 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
388 public static <A, B, C, D, E> F<A, F<B, F<C, F<D, E>>>> curry(final F4<A, B, C, D, E> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
389 return new F<A, F<B, F<C, F<D, E>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
390 public F<B, F<C, F<D, E>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
391 return new F<B, F<C, F<D, E>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
392 public F<C, F<D, E>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
393 return new F<C, F<D, E>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
394 public F<D, E> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
395 return new F<D, E>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
396 public E f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
397 return f.f(a, b, c, d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
398 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
399 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
400 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
401 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
402 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
403 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
404 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
405 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
406 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
407
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
408 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
409 * Curry a function of arity-4.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
410 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
411 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
412 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
413 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
414 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
415 public static <A, B, C, D, E> F<B, F<C, F<D, E>>> curry(final F4<A, B, C, D, E> f, final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
416 return curry(f).f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
417 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
418
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
419 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
420 * Curry a function of arity-4.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
421 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
422 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
423 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
424 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
425 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
426 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
427 public static <A, B, C, D, E> F<C, F<D, E>> curry(final F4<A, B, C, D, E> f, final A a, final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
428 return curry(f).f(a).f(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
429 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
430
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
431 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
432 * Curry a function of arity-4.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
433 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
434 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
435 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
436 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
437 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
438 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
439 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
440 public static <A, B, C, D, E> F<D, E> curry(final F4<A, B, C, D, E> f, final A a, final B b, final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
441 return curry(f).f(a).f(b).f(c);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
442 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
443
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
444 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
445 * Uncurry a function of arity-4.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
446 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
447 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
448 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
449 public static <A, B, C, D, E> F<F<A, F<B, F<C, F<D, E>>>>, F4<A, B, C, D, E>> uncurryF4() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
450 return new F<F<A, F<B, F<C, F<D, E>>>>, F4<A, B, C, D, E>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
451 public F4<A, B, C, D, E> f(final F<A, F<B, F<C, F<D, E>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
452 return uncurryF4(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
453 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
454 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
455 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
456
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
457 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
458 * Uncurry a function of arity-4.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
459 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
460 * @param f The function to uncurry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
461 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
462 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
463 public static <A, B, C, D, E> F4<A, B, C, D, E> uncurryF4(final F<A, F<B, F<C, F<D, E>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
464 return new F4<A, B, C, D, E>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
465 public E f(final A a, final B b, final C c, final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
466 return f.f(a).f(b).f(c).f(d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
467 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
468 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
469 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
470
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
471 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
472 * Curry a function of arity-5.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
473 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
474 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
475 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
476 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
477 public static <A, B, C, D, E, F$> F<A, F<B, F<C, F<D, F<E, F$>>>>> curry(final F5<A, B, C, D, E, F$> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
478 return new F<A, F<B, F<C, F<D, F<E, F$>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
479 public F<B, F<C, F<D, F<E, F$>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
480 return new F<B, F<C, F<D, F<E, F$>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
481 public F<C, F<D, F<E, F$>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
482 return new F<C, F<D, F<E, F$>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
483 public F<D, F<E, F$>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
484 return new F<D, F<E, F$>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
485 public F<E, F$> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
486 return new F<E, F$>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
487 public F$ f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
488 return f.f(a, b, c, d, e);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
489 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
490 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
491 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
492 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
493 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
494 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
495 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
496 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
497 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
498 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
499 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
500
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
501 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
502 * Curry a function of arity-5.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
503 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
504 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
505 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
506 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
507 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
508 public static <A, B, C, D, E, F$> F<B, F<C, F<D, F<E, F$>>>> curry(final F5<A, B, C, D, E, F$> f, final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
509 return curry(f).f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
510 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
511
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
512 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
513 * Curry a function of arity-5.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
514 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
515 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
516 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
517 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
518 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
519 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
520 public static <A, B, C, D, E, F$> F<C, F<D, F<E, F$>>> curry(final F5<A, B, C, D, E, F$> f, final A a, final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
521 return curry(f).f(a).f(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
522 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
523
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
524 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
525 * Curry a function of arity-5.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
526 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
527 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
528 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
529 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
530 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
531 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
532 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
533 public static <A, B, C, D, E, F$> F<D, F<E, F$>> curry(final F5<A, B, C, D, E, F$> f, final A a, final B b,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
534 final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
535 return curry(f).f(a).f(b).f(c);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
536 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
537
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
538 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
539 * Curry a function of arity-5.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
540 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
541 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
542 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
543 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
544 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
545 * @param d An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
546 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
547 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
548 public static <A, B, C, D, E, F$> F<E, F$> curry(final F5<A, B, C, D, E, F$> f, final A a, final B b, final C c,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
549 final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
550 return curry(f).f(a).f(b).f(c).f(d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
551 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
552
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
553 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
554 * Uncurry a function of arity-5.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
555 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
556 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
557 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
558 public static <A, B, C, D, E, F$> F<F<A, F<B, F<C, F<D, F<E, F$>>>>>, F5<A, B, C, D, E, F$>> uncurryF5() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
559 return new F<F<A, F<B, F<C, F<D, F<E, F$>>>>>, F5<A, B, C, D, E, F$>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
560 public F5<A, B, C, D, E, F$> f(final F<A, F<B, F<C, F<D, F<E, F$>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
561 return uncurryF5(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
562 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
563 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
564 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
565
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
566 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
567 * Uncurry a function of arity-6.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
568 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
569 * @param f The function to uncurry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
570 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
571 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
572 public static <A, B, C, D, E, F$> F5<A, B, C, D, E, F$> uncurryF5(final F<A, F<B, F<C, F<D, F<E, F$>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
573 return new F5<A, B, C, D, E, F$>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
574 public F$ f(final A a, final B b, final C c, final D d, final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
575 return f.f(a).f(b).f(c).f(d).f(e);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
576 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
577 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
578 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
579
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
580 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
581 * Curry a function of arity-6.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
582 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
583 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
584 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
585 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
586 public static <A, B, C, D, E, F$, G> F<A, F<B, F<C, F<D, F<E, F<F$, G>>>>>> curry(final F6<A, B, C, D, E, F$, G> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
587 return new F<A, F<B, F<C, F<D, F<E, F<F$, G>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
588 public F<B, F<C, F<D, F<E, F<F$, G>>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
589 return new F<B, F<C, F<D, F<E, F<F$, G>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
590 public F<C, F<D, F<E, F<F$, G>>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
591 return new F<C, F<D, F<E, F<F$, G>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
592 public F<D, F<E, F<F$, G>>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
593 return new F<D, F<E, F<F$, G>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
594 public F<E, F<F$, G>> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
595 return new F<E, F<F$, G>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
596 public F<F$, G> f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
597 return new F<F$, G>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
598 public G f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
599 return f.f(a, b, c, d, e, f$);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
600 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
601 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
602 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
603 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
604 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
605 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
606 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
607 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
608 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
609 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
610 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
611 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
612 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
613
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
614 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
615 * Uncurry a function of arity-6.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
616 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
617 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
618 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
619 public static <A, B, C, D, E, F$, G> F<F<A, F<B, F<C, F<D, F<E, F<F$, G>>>>>>, F6<A, B, C, D, E, F$, G>> uncurryF6() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
620 return new F<F<A, F<B, F<C, F<D, F<E, F<F$, G>>>>>>, F6<A, B, C, D, E, F$, G>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
621 public F6<A, B, C, D, E, F$, G> f(final F<A, F<B, F<C, F<D, F<E, F<F$, G>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
622 return uncurryF6(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
623 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
624 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
625 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
626
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
627 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
628 * Uncurry a function of arity-6.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
629 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
630 * @param f The function to uncurry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
631 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
632 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
633 public static <A, B, C, D, E, F$, G> F6<A, B, C, D, E, F$, G> uncurryF6(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
634 final F<A, F<B, F<C, F<D, F<E, F<F$, G>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
635 return new F6<A, B, C, D, E, F$, G>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
636 public G f(final A a, final B b, final C c, final D d, final E e, final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
637 return f.f(a).f(b).f(c).f(d).f(e).f(f$);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
638 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
639 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
640 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
641
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
642 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
643 * Curry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
644 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
645 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
646 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
647 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
648 public static <A, B, C, D, E, F$, G, H> F<A, F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>>> curry(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
649 final F7<A, B, C, D, E, F$, G, H> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
650 return new F<A, F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
651 public F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
652 return new F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
653 public F<C, F<D, F<E, F<F$, F<G, H>>>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
654 return new F<C, F<D, F<E, F<F$, F<G, H>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
655 public F<D, F<E, F<F$, F<G, H>>>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
656 return new F<D, F<E, F<F$, F<G, H>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
657 public F<E, F<F$, F<G, H>>> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
658 return new F<E, F<F$, F<G, H>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
659 public F<F$, F<G, H>> f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
660 return new F<F$, F<G, H>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
661 public F<G, H> f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
662 return new F<G, H>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
663 public H f(final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
664 return f.f(a, b, c, d, e, f$, g);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
665 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
666 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
667 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
668 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
669 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
670 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
671 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
672 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
673 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
674 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
675 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
676 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
677 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
678 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
679 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
680
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
681 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
682 * Curry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
683 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
684 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
685 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
686 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
687 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
688 public static <A, B, C, D, E, F$, G, H> F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>> curry(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
689 final F7<A, B, C, D, E, F$, G, H> f, final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
690 return curry(f).f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
691 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
692
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
693 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
694 * Curry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
695 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
696 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
697 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
698 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
699 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
700 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
701 public static <A, B, C, D, E, F$, G, H> F<C, F<D, F<E, F<F$, F<G, H>>>>> curry(final F7<A, B, C, D, E, F$, G, H> f,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
702 final A a, final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
703 return curry(f).f(a).f(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
704 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
705
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
706 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
707 * Curry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
708 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
709 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
710 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
711 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
712 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
713 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
714 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
715 public static <A, B, C, D, E, F$, G, H> F<D, F<E, F<F$, F<G, H>>>> curry(final F7<A, B, C, D, E, F$, G, H> f,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
716 final A a, final B b, final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
717 return curry(f).f(a).f(b).f(c);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
718 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
719
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
720 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
721 * Curry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
722 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
723 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
724 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
725 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
726 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
727 * @param d An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
728 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
729 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
730 public static <A, B, C, D, E, F$, G, H> F<E, F<F$, F<G, H>>> curry(final F7<A, B, C, D, E, F$, G, H> f, final A a,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
731 final B b, final C c, final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
732 return curry(f).f(a).f(b).f(c).f(d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
733 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
734
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
735 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
736 * Curry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
737 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
738 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
739 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
740 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
741 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
742 * @param d An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
743 * @param e An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
744 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
745 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
746 public static <A, B, C, D, E, F$, G, H> F<F$, F<G, H>> curry(final F7<A, B, C, D, E, F$, G, H> f, final A a,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
747 final B b, final C c, final D d, final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
748 return curry(f).f(a).f(b).f(c).f(d).f(e);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
749 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
750
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
751 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
752 * Curry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
753 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
754 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
755 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
756 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
757 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
758 * @param d An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
759 * @param e An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
760 * @param f$ An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
761 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
762 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
763 public static <A, B, C, D, E, F$, G, H> F<G, H> curry(final F7<A, B, C, D, E, F$, G, H> f, final A a, final B b,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
764 final C c, final D d, final E e, final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
765 return curry(f).f(a).f(b).f(c).f(d).f(e).f(f$);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
766 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
767
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
768 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
769 * Uncurry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
770 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
771 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
772 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
773 public static <A, B, C, D, E, F$, G, H> F<F<A, F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>>>, F7<A, B, C, D, E, F$, G, H>> uncurryF7() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
774 return new F<F<A, F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>>>, F7<A, B, C, D, E, F$, G, H>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
775 public F7<A, B, C, D, E, F$, G, H> f(final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
776 return uncurryF7(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
777 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
778 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
779 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
780
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
781 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
782 * Uncurry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
783 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
784 * @param f The function to uncurry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
785 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
786 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
787 public static <A, B, C, D, E, F$, G, H> F7<A, B, C, D, E, F$, G, H> uncurryF7(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
788 final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
789 return new F7<A, B, C, D, E, F$, G, H>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
790 public H f(final A a, final B b, final C c, final D d, final E e, final F$ f$, final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
791 return f.f(a).f(b).f(c).f(d).f(e).f(f$).f(g);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
792 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
793 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
794 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
795
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
796 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
797 * Curry a function of arity-8.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
798 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
799 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
800 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
801 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
802 public static <A, B, C, D, E, F$, G, H, I> F<A, F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>>> curry(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
803 final F8<A, B, C, D, E, F$, G, H, I> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
804 return new F<A, F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
805 public F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
806 return new F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
807 public F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
808 return new F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
809 public F<D, F<E, F<F$, F<G, F<H, I>>>>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
810 return new F<D, F<E, F<F$, F<G, F<H, I>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
811 public F<E, F<F$, F<G, F<H, I>>>> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
812 return new F<E, F<F$, F<G, F<H, I>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
813 public F<F$, F<G, F<H, I>>> f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
814 return new F<F$, F<G, F<H, I>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
815 public F<G, F<H, I>> f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
816 return new F<G, F<H, I>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
817 public F<H, I> f(final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
818 return new F<H, I>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
819 public I f(final H h) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
820 return f.f(a, b, c, d, e, f$, g, h);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
821 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
822 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
823 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
824 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
825 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
826 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
827 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
828 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
829 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
830 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
831 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
832 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
833 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
834 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
835 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
836 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
837 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
838
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
839 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
840 * Curry a function of arity-8.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
841 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
842 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
843 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
844 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
845 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
846 public static <A, B, C, D, E, F$, G, H, I> F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>> curry(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
847 final F8<A, B, C, D, E, F$, G, H, I> f, final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
848 return curry(f).f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
849 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
850
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
851 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
852 * Curry a function of arity-8.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
853 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
854 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
855 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
856 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
857 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
858 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
859 public static <A, B, C, D, E, F$, G, H, I> F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>> curry(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
860 final F8<A, B, C, D, E, F$, G, H, I> f, final A a, final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
861 return curry(f).f(a).f(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
862 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
863
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
864 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
865 * Curry a function of arity-8.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
866 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
867 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
868 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
869 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
870 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
871 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
872 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
873 public static <A, B, C, D, E, F$, G, H, I> F<D, F<E, F<F$, F<G, F<H, I>>>>> curry(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
874 final F8<A, B, C, D, E, F$, G, H, I> f, final A a, final B b, final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
875 return curry(f).f(a).f(b).f(c);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
876 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
877
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
878 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
879 * Curry a function of arity-8.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
880 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
881 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
882 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
883 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
884 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
885 * @param d An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
886 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
887 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
888 public static <A, B, C, D, E, F$, G, H, I> F<E, F<F$, F<G, F<H, I>>>> curry(final F8<A, B, C, D, E, F$, G, H, I> f,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
889 final A a, final B b, final C c,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
890 final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
891 return curry(f).f(a).f(b).f(c).f(d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
892 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
893
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
894 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
895 * Curry a function of arity-8.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
896 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
897 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
898 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
899 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
900 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
901 * @param d An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
902 * @param e An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
903 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
904 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
905 public static <A, B, C, D, E, F$, G, H, I> F<F$, F<G, F<H, I>>> curry(final F8<A, B, C, D, E, F$, G, H, I> f,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
906 final A a, final B b, final C c, final D d,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
907 final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
908 return curry(f).f(a).f(b).f(c).f(d).f(e);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
909 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
910
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
911 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
912 * Curry a function of arity-8.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
913 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
914 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
915 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
916 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
917 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
918 * @param d An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
919 * @param e An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
920 * @param f$ An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
921 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
922 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
923 public static <A, B, C, D, E, F$, G, H, I> F<G, F<H, I>> curry(final F8<A, B, C, D, E, F$, G, H, I> f, final A a,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
924 final B b, final C c, final D d, final E e,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
925 final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
926 return curry(f).f(a).f(b).f(c).f(d).f(e).f(f$);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
927 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
928
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
929 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
930 * Curry a function of arity-7.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
931 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
932 * @param f The function to curry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
933 * @param a An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
934 * @param b An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
935 * @param c An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
936 * @param d An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
937 * @param e An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
938 * @param f$ An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
939 * @param g An argument to the curried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
940 * @return A curried form of the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
941 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
942 public static <A, B, C, D, E, F$, G, H, I> F<H, I> curry(final F8<A, B, C, D, E, F$, G, H, I> f, final A a, final B b,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
943 final C c, final D d, final E e, final F$ f$, final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
944 return curry(f).f(a).f(b).f(c).f(d).f(e).f(f$).f(g);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
945 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
946
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
947 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
948 * Uncurry a function of arity-8.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
949 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
950 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
951 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
952 public static <A, B, C, D, E, F$, G, H, I> F<F<A, F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>>>, F8<A, B, C, D, E, F$, G, H, I>> uncurryF8() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
953 return new F<F<A, F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>>>, F8<A, B, C, D, E, F$, G, H, I>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
954 public F8<A, B, C, D, E, F$, G, H, I> f(final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
955 return uncurryF8(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
956 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
957 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
958 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
959
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
960 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
961 * Uncurry a function of arity-8.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
962 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
963 * @param f The function to uncurry.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
964 * @return An uncurried function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
965 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
966 public static <A, B, C, D, E, F$, G, H, I> F8<A, B, C, D, E, F$, G, H, I> uncurryF8(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
967 final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
968 return new F8<A, B, C, D, E, F$, G, H, I>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
969 public I f(final A a, final B b, final C c, final D d, final E e, final F$ f$, final G g, final H h) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
970 return f.f(a).f(b).f(c).f(d).f(e).f(f$).f(g).f(h);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
971 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
972 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
973 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
974
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
975 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
976 * Binds the function in the second argument to the function in the first argument.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
977 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
978 * @param ma A function whose argument type is the same as the argument type of the return value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
979 * @param f A function whose argument type is the same as the return type of <em>ma</em>,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
980 * and yields the return value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
981 * @return A function that chains the given functions together such that the result of applying
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
982 * <em>ma</em> to the argument is given to <i>f</i>, yielding a function
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
983 * that is applied to the argument again.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
984 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
985 public static <A, B, C> F<C, B> bind(final F<C, A> ma, final F<A, F<C, B>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
986 return new F<C, B>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
987 public B f(final C m) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
988 return f.f(ma.f(m)).f(m);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
989 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
990 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
991 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
992
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
993 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
994 * Performs function application within a higher-order function (applicative functor pattern).
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
995 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
996 * @param cab The higher-order function to apply a function to.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
997 * @param ca A function to apply within a higher-order function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
998 * @return A new function after applying the given higher-order function to the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
999 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1000 public static <A, B, C> F<C, B> apply(final F<C, F<A, B>> cab, final F<C, A> ca) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1001 return bind(cab, new F<F<A, B>, F<C, B>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1002 public F<C, B> f(final F<A, B> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1003 return compose(new F<A, B>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1004 public B f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1005 return f.f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1006 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1007 }, ca);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1008 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1009 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1010 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1011
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1012 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1013 * Binds the given function <em>f</em> to the values of the given functions, with a final join.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1014 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1015 * @param ca A function to bind <em>f</em> function to.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1016 * @param cb A function to bind <em>f</em> function to.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1017 * @param f The bound function to be composed with <em>ca</em> and then applied with <em>cb</em>
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1018 * @return A new function after performing the composition, then application.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1019 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1020 public static <A, B, C, D> F<D, C> bind(final F<D, A> ca, final F<D, B> cb, final F<A, F<B, C>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1021 return apply(compose(f, ca), cb);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1022 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1023
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1024 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1025 * Applies a given function over the arguments of another function of arity-2.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1026 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1027 * @param a The function whose arguments to apply another function over.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1028 * @param f The function to apply over the arguments of another function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1029 * @return A function whose arguments are fed through function f, before being passed to function a.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1030 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1031 public static <A, B, C> F<B, F<B, C>> on(final F<A, F<A, C>> a, final F<B, A> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1032 return compose(compose(Function.<B, A, C>andThen().f(f), a), f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1033 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1034
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1035 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1036 * Promotes a function of arity-2 to a higher-order function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1037 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1038 * @param f The function to promote.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1039 * @return A function of arity-2 promoted to compose with two functions.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1040 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1041 public static <A, B, C, D> F<F<D, A>, F<F<D, B>, F<D, C>>> lift(final F<A, F<B, C>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1042 return curry(new F2<F<D, A>, F<D, B>, F<D, C>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1043 public F<D, C> f(final F<D, A> ca, final F<D, B> cb) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1044 return bind(ca, cb, f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1045 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1046 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1047 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1048
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1049 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1050 * Joins two arguments of a function of arity-2 into one argument, yielding a function of arity-1.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1051 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1052 * @param f A function whose arguments to join.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1053 * @return A function of arity-1 whose argument is substituted for both parameters of <em>f</em>.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1054 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1055 public static <A, B> F<B, A> join(final F<B, F<B, A>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1056 return bind(f, Function.<F<B, A>>identity());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1057 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1058
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1059
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1060 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1061 * Partial application of the second argument to the supplied function to get a function of type
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1062 * <tt>A -> C</tt>. Same as <tt>flip(f).f(b)</tt>.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1063 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1064 * @param f The function to partially apply.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1065 * @param b The value to apply to the function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1066 * @return A new function based on <tt>f</tt> with its second argument applied.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1067 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1068 public static <A, B, C> F<A, C> partialApply2(final F<A, F<B, C>> f, final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1069 return new F<A, C>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1070 public C f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1071 return uncurryF2(f).f(a, b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1072 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1073 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1074 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1075
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1076 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1077 * Partial application of the third argument to the supplied function to get a function of type
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1078 * <tt>A -> B -> D</tt>.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1079 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1080 * @param f The function to partially apply.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1081 * @param c The value to apply to the function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1082 * @return A new function based on <tt>f</tt> with its third argument applied.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1083 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1084 public static <A, B, C, D> F<A, F<B, D>> partialApply3(final F<A, F<B, F<C, D>>> f, final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1085 return new F<A, F<B, D>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1086 public F<B, D> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1087 return new F<B, D>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1088 public D f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1089 return uncurryF3(f).f(a, b, c);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1090 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1091 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1092 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1093 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1094 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1095
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1096 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1097 * Partial application of the fourth argument to the supplied function to get a function of type
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1098 * <tt>A -> B -> C -> E</tt>.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1099 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1100 * @param f The function to partially apply.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1101 * @param d The value to apply to the function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1102 * @return A new function based on <tt>f</tt> with its fourth argument applied.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1103 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1104 public static <A, B, C, D, E> F<A, F<B, F<C, E>>> partialApply4(final F<A, F<B, F<C, F<D, E>>>> f, final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1105 return new F<A, F<B, F<C, E>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1106 public F<B, F<C, E>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1107 return new F<B, F<C, E>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1108 public F<C, E> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1109 return new F<C, E>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1110 public E f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1111 return uncurryF4(f).f(a, b, c, d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1112 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1113 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1114 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1115 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1116 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1117 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1118 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1119
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1120 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1121 * Partial application of the fifth argument to the supplied function to get a function of type
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1122 * <tt>A -> B -> C -> D -> F$</tt>.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1123 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1124 * @param f The function to partially apply.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1125 * @param e The value to apply to the function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1126 * @return A new function based on <tt>f</tt> with its fifth argument applied.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1127 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1128 public static <A, B, C, D, E, F$> F<A, F<B, F<C, F<D, F$>>>> partialApply5(final F<A, F<B, F<C, F<D, F<E, F$>>>>> f,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1129 final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1130 return new F<A, F<B, F<C, F<D, F$>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1131 public F<B, F<C, F<D, F$>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1132 return new F<B, F<C, F<D, F$>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1133 public F<C, F<D, F$>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1134 return new F<C, F<D, F$>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1135 public F<D, F$> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1136 return new F<D, F$>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1137 public F$ f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1138 return uncurryF5(f).f(a, b, c, d, e);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1139 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1140 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1141 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1142 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1143 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1144 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1145 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1146 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1147 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1148
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1149 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1150 * Partial application of the sixth argument to the supplied function to get a function of type
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1151 * <tt>A -> B -> C -> D -> E -> G</tt>.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1152 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1153 * @param f The function to partially apply.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1154 * @param f$ The value to apply to the function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1155 * @return A new function based on <tt>f</tt> with its sixth argument applied.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1156 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1157 public static <A, B, C, D, E, F$, G> F<A, F<B, F<C, F<D, F<E, G>>>>> partialApply6(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1158 final F<A, F<B, F<C, F<D, F<E, F<F$, G>>>>>> f, final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1159 return new F<A, F<B, F<C, F<D, F<E, G>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1160 public F<B, F<C, F<D, F<E, G>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1161 return new F<B, F<C, F<D, F<E, G>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1162 public F<C, F<D, F<E, G>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1163 return new F<C, F<D, F<E, G>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1164 public F<D, F<E, G>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1165 return new F<D, F<E, G>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1166 public F<E, G> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1167 return new F<E, G>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1168 public G f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1169 return uncurryF6(f).f(a, b, c, d, e, f$);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1170 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1171 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1172 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1173 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1174 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1175 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1176 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1177 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1178 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1179 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1180 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1181
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1182 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1183 * Partial application of the seventh argument to the supplied function to get a function of type
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1184 * <tt>A -> B -> C -> D -> E -> F$ -> H</tt>.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1185 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1186 * @param f The function to partially apply.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1187 * @param g The value to apply to the function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1188 * @return A new function based on <tt>f</tt> with its seventh argument applied.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1189 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1190 public static <A, B, C, D, E, F$, G, H> F<A, F<B, F<C, F<D, F<E, F<F$, H>>>>>> partialApply7(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1191 final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, H>>>>>>> f, final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1192 return new F<A, F<B, F<C, F<D, F<E, F<F$, H>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1193 public F<B, F<C, F<D, F<E, F<F$, H>>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1194 return new F<B, F<C, F<D, F<E, F<F$, H>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1195 public F<C, F<D, F<E, F<F$, H>>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1196 return new F<C, F<D, F<E, F<F$, H>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1197 public F<D, F<E, F<F$, H>>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1198 return new F<D, F<E, F<F$, H>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1199 public F<E, F<F$, H>> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1200 return new F<E, F<F$, H>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1201 public F<F$, H> f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1202 return new F<F$, H>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1203 public H f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1204 return uncurryF7(f).f(a, b, c, d, e, f$, g);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1205 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1206 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1207 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1208 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1209 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1210 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1211 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1212 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1213 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1214 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1215 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1216 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1217 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1218
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1219 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1220 * Partial application of the eigth argument to the supplied function to get a function of type
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1221 * <tt>A -> B -> C -> D -> E -> F$ -> G -> I</tt>.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1222 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1223 * @param f The function to partially apply.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1224 * @param h The value to apply to the function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1225 * @return A new function based on <tt>f</tt> with its eigth argument applied.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1226 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1227 public static <A, B, C, D, E, F$, G, H, I> F<A, F<B, F<C, F<D, F<E, F<F$, F<G, I>>>>>>> partialApply8(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1228 final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, F<H, I>>>>>>>> f, final H h) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1229 return new F<A, F<B, F<C, F<D, F<E, F<F$, F<G, I>>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1230 public F<B, F<C, F<D, F<E, F<F$, F<G, I>>>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1231 return new F<B, F<C, F<D, F<E, F<F$, F<G, I>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1232 public F<C, F<D, F<E, F<F$, F<G, I>>>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1233 return new F<C, F<D, F<E, F<F$, F<G, I>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1234 public F<D, F<E, F<F$, F<G, I>>>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1235 return new F<D, F<E, F<F$, F<G, I>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1236 public F<E, F<F$, F<G, I>>> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1237 return new F<E, F<F$, F<G, I>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1238 public F<F$, F<G, I>> f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1239 return new F<F$, F<G, I>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1240 public F<G, I> f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1241 return new F<G, I>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1242 public I f(final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1243 return uncurryF8(f).f(a, b, c, d, e, f$, g, h);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1244 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1245 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1246 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1247 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1248 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1249 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1250 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1251 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1252 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1253 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1254 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1255 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1256 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1257 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1258 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1259 }