|
7 | 7 |
|
8 | 8 | import java.util.function.BiFunction;
|
9 | 9 |
|
10 |
| -import static com.jnape.palatable.lambda.functions.Fn2.fn2; |
11 |
| - |
12 | 10 | /**
|
13 | 11 | * Lift into and apply a {@link BiFunction} to two {@link Applicative} values, returning the result inside the same
|
14 |
| - * {@link Applicative} context. Equivalent ot <code>appB.zip(appA.fmap(fn))</code>. |
| 12 | + * {@link Applicative} context. Functionally equivalent to <code>appB.zip(appA.fmap(fn))</code>. |
15 | 13 | *
|
16 |
| - * @param <A> the function's first argument type |
17 |
| - * @param <B> the function's second argument type |
18 |
| - * @param <C> the function's return type |
19 |
| - * @param <App> the applicative unification type |
| 14 | + * @param <A> the function's first argument type |
| 15 | + * @param <B> the function's second argument typ |
| 16 | + * @param <C> 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 applicative return type |
20 | 21 | * @see Applicative#zip(Applicative)
|
21 | 22 | */
|
22 |
| -public final class LiftA2<A, B, C, App extends Applicative> implements Fn3<BiFunction<? super A, ? super B, ? extends C>, |
23 |
| - Applicative<A, App>, Applicative<B, App>, Applicative<C, App>> { |
| 23 | +public final class LiftA2<A, B, C, App extends Applicative, |
| 24 | + AppA extends Applicative<A, App>, |
| 25 | + AppB extends Applicative<B, App>, |
| 26 | + AppC extends Applicative<C, App>> implements Fn3<BiFunction<? super A, ? super B, ? extends C>, AppA, AppB, AppC> { |
24 | 27 |
|
25 | 28 | private static final LiftA2 INSTANCE = new LiftA2();
|
26 | 29 |
|
27 | 30 | private LiftA2() {
|
28 | 31 | }
|
29 | 32 |
|
30 | 33 | @Override
|
31 |
| - public Applicative<C, App> apply(BiFunction<? super A, ? super B, ? extends C> fn, |
32 |
| - Applicative<A, App> appA, |
33 |
| - Applicative<B, App> appB) { |
34 |
| - return appB.zip(appA.fmap(fn2(fn))); |
| 34 | + public AppC apply(BiFunction<? super A, ? super B, ? extends C> fn, AppA appA, AppB appB) { |
| 35 | + return appB.zip(appA.fmap(Fn2.<A, B, C>fn2(fn))).coerce(); |
35 | 36 | }
|
36 | 37 |
|
37 | 38 | @SuppressWarnings("unchecked")
|
38 |
| - public static <A, B, C, App extends Applicative> LiftA2<A, B, C, App> liftA2() { |
| 39 | + public static <A, B, C, App extends Applicative, AppA extends Applicative<A, App>, AppB extends Applicative<B, App>, AppC extends Applicative<C, App>> LiftA2<A, B, C, App, AppA, AppB, AppC> liftA2() { |
39 | 40 | return INSTANCE;
|
40 | 41 | }
|
41 | 42 |
|
42 |
| - public static <A, B, C, App extends Applicative> Fn2<Applicative<A, App>, Applicative<B, App>, Applicative<C, App>> liftA2( |
| 43 | + public static <A, B, C, App extends Applicative, AppA extends Applicative<A, App>, AppB extends Applicative<B, App>, AppC extends Applicative<C, App>> Fn2<AppA, AppB, AppC> liftA2( |
43 | 44 | BiFunction<? super A, ? super B, ? extends C> fn) {
|
44 |
| - return LiftA2.<A, B, C, App>liftA2().apply(fn); |
| 45 | + return LiftA2.<A, B, C, App, AppA, AppB, AppC>liftA2().apply(fn); |
45 | 46 | }
|
46 | 47 |
|
47 |
| - public static <A, B, C, App extends Applicative> Fn1<Applicative<B, App>, Applicative<C, App>> liftA2( |
48 |
| - BiFunction<? super A, ? super B, ? extends C> fn, Applicative<A, App> appA) { |
49 |
| - return LiftA2.<A, B, C, App>liftA2(fn).apply(appA); |
| 48 | + public static <A, B, C, App extends Applicative, AppA extends Applicative<A, App>, AppB extends Applicative<B, App>, AppC extends Applicative<C, App>> Fn1<AppB, AppC> liftA2( |
| 49 | + BiFunction<? super A, ? super B, ? extends C> fn, |
| 50 | + AppA appA) { |
| 51 | + return LiftA2.<A, B, C, App, AppA, AppB, AppC>liftA2(fn).apply(appA); |
50 | 52 | }
|
51 | 53 |
|
52 |
| - public static <A, B, C, App extends Applicative> Applicative<C, App> liftA2( |
53 |
| - BiFunction<? super A, ? super B, ? extends C> fn, Applicative<A, App> appA, Applicative<B, App> appB) { |
54 |
| - return LiftA2.<A, B, C, App>liftA2(fn, appA).apply(appB); |
| 54 | + public static <A, B, C, App extends Applicative, AppA extends Applicative<A, App>, AppB extends Applicative<B, App>, AppC extends Applicative<C, App>> AppC liftA2( |
| 55 | + BiFunction<? super A, ? super B, ? extends C> fn, |
| 56 | + AppA appA, |
| 57 | + AppB appB) { |
| 58 | + return LiftA2.<A, B, C, App, AppA, AppB, AppC>liftA2(fn, appA).apply(appB); |
55 | 59 | }
|
56 | 60 | }
|
0 commit comments