|
| 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