Skip to content

Commit 17e8762

Browse files
committed
Adding LiftA3-LiftA8
1 parent ba86af4 commit 17e8762

File tree

12 files changed

+752
-1
lines changed

12 files changed

+752
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
2222
- `Tuple2-8` specializations of left/right product rotation
2323
- `CheckedEffect`, an `Effect` variant that can throw checked exceptions
2424
- `CheckedFn1#checked`, convenience static factory method to aid inference
25+
- `LiftA3-8`, higher-arity analogs to `LiftA2`
2526

2627
### Deprecated
2728
- `AddAll` semigroup, in favor of the monoid that no longer mutates any argument

src/main/java/com/jnape/palatable/lambda/functions/builtin/fn3/LiftA2.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* {@link Applicative} context. Functionally equivalent to <code>appB.zip(appA.fmap(fn))</code>.
1313
*
1414
* @param <A> the function's first argument type
15-
* @param <B> the function's second argument typ
15+
* @param <B> the function's second argument type
1616
* @param <C> the function's return type
1717
* @param <App> the applicative unification type
1818
* @param <AppA> the inferred first applicative argument type
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.jnape.palatable.lambda.functions.builtin.fn4;
2+
3+
import com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.lambda.functions.Fn2;
5+
import com.jnape.palatable.lambda.functions.Fn3;
6+
import com.jnape.palatable.lambda.functions.Fn4;
7+
import com.jnape.palatable.lambda.functor.Applicative;
8+
9+
/**
10+
* Lift into and apply an {@link Fn3} to three {@link Applicative} values, returning the result inside the same
11+
* {@link Applicative} context.
12+
*
13+
* @param <A> the function's first argument type
14+
* @param <B> the function's second argument type
15+
* @param <C> the function's third argument type
16+
* @param <D> the function's return type
17+
* @param <App> the applicative unification type
18+
* @param <AppA> the inferred first applicative argument type
19+
* @param <AppB> the inferred second applicative argument type
20+
* @param <AppC> the inferred third applicative argument type
21+
* @param <AppD> the inferred applicative return type
22+
* @see Applicative#zip(Applicative)
23+
*/
24+
public final class LiftA3<A, B, C, D,
25+
App extends Applicative,
26+
AppA extends Applicative<A, App>,
27+
AppB extends Applicative<B, App>,
28+
AppC extends Applicative<C, App>,
29+
AppD extends Applicative<D, App>> implements Fn4<Fn3<A, B, C, D>, AppA, AppB, AppC, AppD> {
30+
31+
private static final LiftA3 INSTANCE = new LiftA3();
32+
33+
private LiftA3() {
34+
}
35+
36+
@Override
37+
public AppD apply(Fn3<A, B, C, D> fn, AppA appA, AppB appB, AppC appC) {
38+
return appC.zip(appB.zip(appA.fmap(fn))).coerce();
39+
}
40+
41+
@SuppressWarnings("unchecked")
42+
public static <A, B, C, D,
43+
App extends Applicative,
44+
AppA extends Applicative<A, App>,
45+
AppB extends Applicative<B, App>,
46+
AppC extends Applicative<C, App>,
47+
AppD extends Applicative<D, App>> LiftA3<A, B, C, D, App, AppA, AppB, AppC, AppD> liftA3() {
48+
return INSTANCE;
49+
}
50+
51+
public static <A, B, C, D,
52+
App extends Applicative,
53+
AppA extends Applicative<A, App>,
54+
AppB extends Applicative<B, App>,
55+
AppC extends Applicative<C, App>,
56+
AppD extends Applicative<D, App>> Fn3<AppA, AppB, AppC, AppD> liftA3(Fn3<A, B, C, D> fn) {
57+
return LiftA3.<A, B, C, D, App, AppA, AppB, AppC, AppD>liftA3().apply(fn);
58+
}
59+
60+
public static <A, B, C, D,
61+
App extends Applicative,
62+
AppA extends Applicative<A, App>,
63+
AppB extends Applicative<B, App>,
64+
AppC extends Applicative<C, App>,
65+
AppD extends Applicative<D, App>> Fn2<AppB, AppC, AppD> liftA3(Fn3<A, B, C, D> fn, AppA appA) {
66+
return LiftA3.<A, B, C, D, App, AppA, AppB, AppC, AppD>liftA3(fn).apply(appA);
67+
}
68+
69+
public static <A, B, C, D,
70+
App extends Applicative,
71+
AppA extends Applicative<A, App>,
72+
AppB extends Applicative<B, App>,
73+
AppC extends Applicative<C, App>,
74+
AppD extends Applicative<D, App>> Fn1<AppC, AppD> liftA3(Fn3<A, B, C, D> fn, AppA appA, AppB appB) {
75+
return LiftA3.<A, B, C, D, App, AppA, AppB, AppC, AppD>liftA3(fn, appA).apply(appB);
76+
}
77+
78+
public static <A, B, C, D,
79+
App extends Applicative,
80+
AppA extends Applicative<A, App>,
81+
AppB extends Applicative<B, App>,
82+
AppC extends Applicative<C, App>,
83+
AppD extends Applicative<D, App>> AppD liftA3(Fn3<A, B, C, D> fn, AppA appA, AppB appB,
84+
AppC appC) {
85+
return LiftA3.<A, B, C, D, App, AppA, AppB, AppC, AppD>liftA3(fn, appA, appB).apply(appC);
86+
}
87+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.jnape.palatable.lambda.functions.builtin.fn5;
2+
3+
import com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.lambda.functions.Fn2;
5+
import com.jnape.palatable.lambda.functions.Fn3;
6+
import com.jnape.palatable.lambda.functions.Fn4;
7+
import com.jnape.palatable.lambda.functions.Fn5;
8+
import com.jnape.palatable.lambda.functor.Applicative;
9+
10+
/**
11+
* Lift into and apply an {@link Fn4} to four {@link Applicative} values, returning the result inside the same
12+
* {@link Applicative} context.
13+
*
14+
* @param <A> the function's first argument type
15+
* @param <B> the function's second argument type
16+
* @param <C> the function's third argument type
17+
* @param <D> the function's fourth argument type
18+
* @param <E> the function's return type
19+
* @param <App> the applicative unification type
20+
* @param <AppA> the inferred first applicative argument type
21+
* @param <AppB> the inferred second applicative argument type
22+
* @param <AppC> the inferred third applicative argument type
23+
* @param <AppD> the inferred fourth applicative argument type
24+
* @param <AppE> the inferred applicative return type
25+
* @see Applicative#zip(Applicative)
26+
*/
27+
public final class LiftA4<A, B, C, D, E,
28+
App extends Applicative,
29+
AppA extends Applicative<A, App>,
30+
AppB extends Applicative<B, App>,
31+
AppC extends Applicative<C, App>,
32+
AppD extends Applicative<D, App>,
33+
AppE extends Applicative<E, App>> implements Fn5<Fn4<A, B, C, D, E>, AppA, AppB, AppC, AppD, AppE> {
34+
35+
private static final LiftA4 INSTANCE = new LiftA4();
36+
37+
private LiftA4() {
38+
}
39+
40+
@Override
41+
public AppE apply(Fn4<A, B, C, D, E> fn, AppA appA, AppB appB, AppC appC, AppD appD) {
42+
return appD.zip(appC.zip(appB.zip(appA.fmap(fn)))).coerce();
43+
}
44+
45+
@SuppressWarnings("unchecked")
46+
public static <A, B, C, D, E,
47+
App extends Applicative,
48+
AppA extends Applicative<A, App>,
49+
AppB extends Applicative<B, App>,
50+
AppC extends Applicative<C, App>,
51+
AppD extends Applicative<D, App>,
52+
AppE extends Applicative<E, App>> LiftA4<A, B, C, D, E, App, AppA, AppB, AppC, AppD, AppE> liftA4() {
53+
return INSTANCE;
54+
}
55+
56+
public static <A, B, C, D, E,
57+
App extends Applicative,
58+
AppA extends Applicative<A, App>,
59+
AppB extends Applicative<B, App>,
60+
AppC extends Applicative<C, App>,
61+
AppD extends Applicative<D, App>,
62+
AppE extends Applicative<E, App>> Fn4<AppA, AppB, AppC, AppD, AppE> liftA4(Fn4<A, B, C, D, E> fn) {
63+
return LiftA4.<A, B, C, D, E, App, AppA, AppB, AppC, AppD, AppE>liftA4().apply(fn);
64+
}
65+
66+
public static <A, B, C, D, E,
67+
App extends Applicative,
68+
AppA extends Applicative<A, App>,
69+
AppB extends Applicative<B, App>,
70+
AppC extends Applicative<C, App>,
71+
AppD extends Applicative<D, App>,
72+
AppE extends Applicative<E, App>> Fn3<AppB, AppC, AppD, AppE> liftA4(Fn4<A, B, C, D, E> fn, AppA appA) {
73+
return LiftA4.<A, B, C, D, E, App, AppA, AppB, AppC, AppD, AppE>liftA4(fn).apply(appA);
74+
}
75+
76+
public static <A, B, C, D, E,
77+
App extends Applicative,
78+
AppA extends Applicative<A, App>,
79+
AppB extends Applicative<B, App>,
80+
AppC extends Applicative<C, App>,
81+
AppD extends Applicative<D, App>,
82+
AppE extends Applicative<E, App>> Fn2<AppC, AppD, AppE> liftA4(Fn4<A, B, C, D, E> fn, AppA appA,
83+
AppB appB) {
84+
return LiftA4.<A, B, C, D, E, App, AppA, AppB, AppC, AppD, AppE>liftA4(fn, appA).apply(appB);
85+
}
86+
87+
public static <A, B, C, D, E,
88+
App extends Applicative,
89+
AppA extends Applicative<A, App>,
90+
AppB extends Applicative<B, App>,
91+
AppC extends Applicative<C, App>,
92+
AppD extends Applicative<D, App>,
93+
AppE extends Applicative<E, App>> Fn1<AppD, AppE> liftA4(Fn4<A, B, C, D, E> fn, AppA appA, AppB appB,
94+
AppC appC) {
95+
return LiftA4.<A, B, C, D, E, App, AppA, AppB, AppC, AppD, AppE>liftA4(fn, appA, appB).apply(appC);
96+
}
97+
98+
public static <A, B, C, D, E,
99+
App extends Applicative,
100+
AppA extends Applicative<A, App>,
101+
AppB extends Applicative<B, App>,
102+
AppC extends Applicative<C, App>,
103+
AppD extends Applicative<D, App>,
104+
AppE extends Applicative<E, App>> AppE liftA4(Fn4<A, B, C, D, E> fn, AppA appA, AppB appB,
105+
AppC appC, AppD appD) {
106+
return LiftA4.<A, B, C, D, E, App, AppA, AppB, AppC, AppD, AppE>liftA4(fn, appA, appB, appC).apply(appD);
107+
}
108+
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package com.jnape.palatable.lambda.functions.builtin.fn6;
2+
3+
import com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.lambda.functions.Fn2;
5+
import com.jnape.palatable.lambda.functions.Fn3;
6+
import com.jnape.palatable.lambda.functions.Fn4;
7+
import com.jnape.palatable.lambda.functions.Fn5;
8+
import com.jnape.palatable.lambda.functions.Fn6;
9+
import com.jnape.palatable.lambda.functor.Applicative;
10+
11+
/**
12+
* Lift into and apply an {@link Fn5} to five {@link Applicative} values, returning the result inside the same
13+
* {@link Applicative} context.
14+
*
15+
* @param <A> the function's first argument type
16+
* @param <B> the function's second argument type
17+
* @param <C> the function's third argument type
18+
* @param <D> the function's fourth argument type
19+
* @param <E> the function's fifth argument type
20+
* @param <F> the function's return type
21+
* @param <App> the applicative unification type
22+
* @param <AppA> the inferred first applicative argument type
23+
* @param <AppB> the inferred second applicative argument type
24+
* @param <AppC> the inferred third applicative argument type
25+
* @param <AppD> the inferred fourth applicative argument type
26+
* @param <AppE> the inferred fifth applicative argument type
27+
* @param <AppF> the inferred applicative return type
28+
* @see Applicative#zip(Applicative)
29+
*/
30+
public final class LiftA5<A, B, C, D, E, F,
31+
App extends Applicative,
32+
AppA extends Applicative<A, App>,
33+
AppB extends Applicative<B, App>,
34+
AppC extends Applicative<C, App>,
35+
AppD extends Applicative<D, App>,
36+
AppE extends Applicative<E, App>,
37+
AppF extends Applicative<F, App>> implements Fn6<Fn5<A, B, C, D, E, F>, AppA, AppB, AppC, AppD, AppE, AppF> {
38+
39+
private static final LiftA5 INSTANCE = new LiftA5();
40+
41+
private LiftA5() {
42+
}
43+
44+
@Override
45+
public AppF apply(Fn5<A, B, C, D, E, F> fn, AppA appA, AppB appB, AppC appC, AppD appD, AppE appE) {
46+
return appE.zip(appD.zip(appC.zip(appB.zip(appA.fmap(fn))))).coerce();
47+
}
48+
49+
@SuppressWarnings("unchecked")
50+
public static <A, B, C, D, E, F,
51+
App extends Applicative,
52+
AppA extends Applicative<A, App>,
53+
AppB extends Applicative<B, App>,
54+
AppC extends Applicative<C, App>,
55+
AppD extends Applicative<D, App>,
56+
AppE extends Applicative<E, App>,
57+
AppF extends Applicative<F, App>> LiftA5<A, B, C, D, E, F, App, AppA, AppB, AppC, AppD, AppE, AppF> liftA5() {
58+
return INSTANCE;
59+
}
60+
61+
public static <A, B, C, D, E, F,
62+
App extends Applicative,
63+
AppA extends Applicative<A, App>,
64+
AppB extends Applicative<B, App>,
65+
AppC extends Applicative<C, App>,
66+
AppD extends Applicative<D, App>,
67+
AppE extends Applicative<E, App>,
68+
AppF extends Applicative<F, App>> Fn5<AppA, AppB, AppC, AppD, AppE, AppF> liftA5(Fn5<A, B, C, D, E, F> fn) {
69+
return LiftA5.<A, B, C, D, E, F, App, AppA, AppB, AppC, AppD, AppE, AppF>liftA5().apply(fn);
70+
}
71+
72+
public static <A, B, C, D, E, F,
73+
App extends Applicative,
74+
AppA extends Applicative<A, App>,
75+
AppB extends Applicative<B, App>,
76+
AppC extends Applicative<C, App>,
77+
AppD extends Applicative<D, App>,
78+
AppE extends Applicative<E, App>,
79+
AppF extends Applicative<F, App>> Fn4<AppB, AppC, AppD, AppE, AppF> liftA5(Fn5<A, B, C, D, E, F> fn,
80+
AppA appA) {
81+
return LiftA5.<A, B, C, D, E, F, App, AppA, AppB, AppC, AppD, AppE, AppF>liftA5(fn).apply(appA);
82+
}
83+
84+
public static <A, B, C, D, E, F,
85+
App extends Applicative,
86+
AppA extends Applicative<A, App>,
87+
AppB extends Applicative<B, App>,
88+
AppC extends Applicative<C, App>,
89+
AppD extends Applicative<D, App>,
90+
AppE extends Applicative<E, App>,
91+
AppF extends Applicative<F, App>> Fn3<AppC, AppD, AppE, AppF> liftA5(Fn5<A, B, C, D, E, F> fn, AppA appA,
92+
AppB appB) {
93+
return LiftA5.<A, B, C, D, E, F, App, AppA, AppB, AppC, AppD, AppE, AppF>liftA5(fn, appA).apply(appB);
94+
}
95+
96+
public static <A, B, C, D, E, F,
97+
App extends Applicative,
98+
AppA extends Applicative<A, App>,
99+
AppB extends Applicative<B, App>,
100+
AppC extends Applicative<C, App>,
101+
AppD extends Applicative<D, App>,
102+
AppE extends Applicative<E, App>,
103+
AppF extends Applicative<F, App>> Fn2<AppD, AppE, AppF> liftA5(Fn5<A, B, C, D, E, F> fn, AppA appA,
104+
AppB appB,
105+
AppC appC) {
106+
return LiftA5.<A, B, C, D, E, F, App, AppA, AppB, AppC, AppD, AppE, AppF>liftA5(fn, appA, appB).apply(appC);
107+
}
108+
109+
public static <A, B, C, D, E, F,
110+
App extends Applicative,
111+
AppA extends Applicative<A, App>,
112+
AppB extends Applicative<B, App>,
113+
AppC extends Applicative<C, App>,
114+
AppD extends Applicative<D, App>,
115+
AppE extends Applicative<E, App>,
116+
AppF extends Applicative<F, App>> Fn1<AppE, AppF> liftA5(Fn5<A, B, C, D, E, F> fn, AppA appA, AppB appB,
117+
AppC appC, AppD appD) {
118+
return LiftA5.<A, B, C, D, E, F, App, AppA, AppB, AppC, AppD, AppE, AppF>liftA5(fn, appA, appB, appC).apply(appD);
119+
}
120+
121+
public static <A, B, C, D, E, F,
122+
App extends Applicative,
123+
AppA extends Applicative<A, App>,
124+
AppB extends Applicative<B, App>,
125+
AppC extends Applicative<C, App>,
126+
AppD extends Applicative<D, App>,
127+
AppE extends Applicative<E, App>,
128+
AppF extends Applicative<F, App>> AppF liftA5(Fn5<A, B, C, D, E, F> fn, AppA appA, AppB appB,
129+
AppC appC, AppD appD, AppE appE) {
130+
return LiftA5.<A, B, C, D, E, F, App, AppA, AppB, AppC, AppD, AppE, AppF>liftA5(fn, appA, appB, appC, appD).apply(appE);
131+
}
132+
}

0 commit comments

Comments
 (0)