|
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