package fj;
import static fj.P.weakMemo;
/**
* A product-8.
*
* @version %build.number%
*/
@SuppressWarnings("UnnecessaryFullyQualifiedName")
public abstract class P8<A, B, C, D, E, F, G, H> {
/**
* Access the first element of the product.
*
* @return The first element of the product.
*/
public abstract A _1();
/**
* Access the second element of the product.
*
* @return The second element of the product.
*/
public abstract B _2();
/**
* Access the third element of the product.
*
* @return The third element of the product.
*/
public abstract C _3();
/**
* Access the fourth element of the product.
*
* @return The fourth element of the product.
*/
public abstract D _4();
/**
* Access the fifth element of the product.
*
* @return The fifth element of the product.
*/
public abstract E _5();
/**
* Access the sixth element of the product.
*
* @return The sixth element of the product.
*/
public abstract F _6();
/**
* Access the seventh element of the product.
*
* @return The seventh element of the product.
*/
public abstract G _7();
/**
* Access the eighth element of the product.
*
* @return The eighth element of the product.
*/
public abstract H _8();
/**
* Map the first element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final <X> P8<X, B, C, D, E, F, G, H> map1(final fj.F<A, X> f) {
return new P8<X, B, C, D, E, F, G, H>() {
public X _1() {
return f.f(P8.this._1());
}
public B _2() {
return P8.this._2();
}
public C _3() {
return P8.this._3();
}
public D _4() {
return P8.this._4();
}
public E _5() {
return P8.this._5();
}
public F _6() {
return P8.this._6();
}
public G _7() {
return P8.this._7();
}
public H _8() {
return P8.this._8();
}
};
}
/**
* Map the second element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final <X> P8<A, X, C, D, E, F, G, H> map2(final fj.F<B, X> f) {
return new P8<A, X, C, D, E, F, G, H>() {
public A _1() {
return P8.this._1();
}
public X _2() {
return f.f(P8.this._2());
}
public C _3() {
return P8.this._3();
}
public D _4() {
return P8.this._4();
}
public E _5() {
return P8.this._5();
}
public F _6() {
return P8.this._6();
}
public G _7() {
return P8.this._7();
}
public H _8() {
return P8.this._8();
}
};
}
/**
* Map the third element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final <X> P8<A, B, X, D, E, F, G, H> map3(final fj.F<C, X> f) {
return new P8<A, B, X, D, E, F, G, H>() {
public A _1() {
return P8.this._1();
}
public B _2() {
return P8.this._2();
}
public X _3() {
return f.f(P8.this._3());
}
public D _4() {
return P8.this._4();
}
public E _5() {
return P8.this._5();
}
public F _6() {
return P8.this._6();
}
public G _7() {
return P8.this._7();
}
public H _8() {
return P8.this._8();
}
};
}
/**
* Map the fourth element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final <X> P8<A, B, C, X, E, F, G, H> map4(final fj.F<D, X> f) {
return new P8<A, B, C, X, E, F, G, H>() {
public A _1() {
return P8.this._1();
}
public B _2() {
return P8.this._2();
}
public C _3() {
return P8.this._3();
}
public X _4() {
return f.f(P8.this._4());
}
public E _5() {
return P8.this._5();
}
public F _6() {
return P8.this._6();
}
public G _7() {
return P8.this._7();
}
public H _8() {
return P8.this._8();
}
};
}
/**
* Map the fifth element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final <X> P8<A, B, C, D, X, F, G, H> map5(final fj.F<E, X> f) {
return new P8<A, B, C, D, X, F, G, H>() {
public A _1() {
return P8.this._1();
}
public B _2() {
return P8.this._2();
}
public C _3() {
return P8.this._3();
}
public D _4() {
return P8.this._4();
}
public X _5() {
return f.f(P8.this._5());
}
public F _6() {
return P8.this._6();
}
public G _7() {
return P8.this._7();
}
public H _8() {
return P8.this._8();
}
};
}
/**
* Map the sixth element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final <X> P8<A, B, C, D, E, X, G, H> map6(final fj.F<F, X> f) {
return new P8<A, B, C, D, E, X, G, H>() {
public A _1() {
return P8.this._1();
}
public B _2() {
return P8.this._2();
}
public C _3() {
return P8.this._3();
}
public D _4() {
return P8.this._4();
}
public E _5() {
return P8.this._5();
}
public X _6() {
return f.f(P8.this._6());
}
public G _7() {
return P8.this._7();
}
public H _8() {
return P8.this._8();
}
};
}
/**
* Map the seventh element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final <X> P8<A, B, C, D, E, F, X, H> map7(final fj.F<G, X> f) {
return new P8<A, B, C, D, E, F, X, H>() {
public A _1() {
return P8.this._1();
}
public B _2() {
return P8.this._2();
}
public C _3() {
return P8.this._3();
}
public D _4() {
return P8.this._4();
}
public E _5() {
return P8.this._5();
}
public F _6() {
return P8.this._6();
}
public X _7() {
return f.f(P8.this._7());
}
public H _8() {
return P8.this._8();
}
};
}
/**
* Map the eighth element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final <X> P8<A, B, C, D, E, F, G, X> map8(final fj.F<H, X> f) {
return new P8<A, B, C, D, E, F, G, X>() {
public A _1() {
return P8.this._1();
}
public B _2() {
return P8.this._2();
}
public C _3() {
return P8.this._3();
}
public D _4() {
return P8.this._4();
}
public E _5() {
return P8.this._5();
}
public F _6() {
return P8.this._6();
}
public G _7() {
return P8.this._7();
}
public X _8() {
return f.f(P8.this._8());
}
};
}
/**
* Returns the 1-product projection over the first element.
*
* @return the 1-product projection over the first element.
*/
public final P1<A> _1_() {
return F1Functions.lazy(P8.<A, B, C, D, E, F, G, H>__1()).f(this);
}
/**
* Returns the 1-product projection over the second element.
*
* @return the 1-product projection over the second element.
*/
public final P1<B> _2_() {
return F1Functions.lazy(P8.<A, B, C, D, E, F, G, H>__2()).f(this);
}
/**
* Returns the 1-product projection over the third element.
*
* @return the 1-product projection over the third element.
*/
public final P1<C> _3_() {
return F1Functions.lazy(P8.<A, B, C, D, E, F, G, H>__3()).f(this);
}
/**
* Returns the 1-product projection over the fourth element.
*
* @return the 1-product projection over the fourth element.
*/
public final P1<D> _4_() {
return F1Functions.lazy(P8.<A, B, C, D, E, F, G, H>__4()).f(this);
}
/**
* Returns the 1-product projection over the fifth element.
*
* @return the 1-product projection over the fifth element.
*/
public final P1<E> _5_() {
return F1Functions.lazy(P8.<A, B, C, D, E, F, G, H>__5()).f(this);
}
/**
* Returns the 1-product projection over the sixth element.
*
* @return the 1-product projection over the sixth element.
*/
public final P1<F> _6_() {
return F1Functions.lazy(P8.<A, B, C, D, E, F, G, H>__6()).f(this);
}
/**
* Returns the 1-product projection over the seventh element.
*
* @return the 1-product projection over the seventh element.
*/
public final P1<G> _7_() {
return F1Functions.lazy(P8.<A, B, C, D, E, F, G, H>__7()).f(this);
}
/**
* Returns the 1-product projection over the eighth element.
*
* @return the 1-product projection over the eighth element.
*/
public final P1<H> _8_() {
return F1Functions.lazy(P8.<A, B, C, D, E, F, G, H>__8()).f(this);
}
/**
* Provides a memoising P8 that remembers its values.
*
* @return A P8 that calls this P8 once for any given element and remembers the value for subsequent calls.
*/
public final P8<A, B, C, D, E, F, G, H> memo() {
P8<A, B, C, D, E, F, G, H> self = this;
return new P8<A, B, C, D, E, F, G, H>() {
private final P1<A> a = weakMemo(self::_1);
private final P1<B> b = weakMemo(self::_2);
private final P1<C> c = weakMemo(self::_3);
private final P1<D> d = weakMemo(self::_4);
private final P1<E> e = weakMemo(self::_5);
private final P1<F> f = weakMemo(self::_6);
private final P1<G> g = weakMemo(self::_7);
private final P1<H> h = weakMemo(self::_8);
public A _1() {
return a._1();
}
public B _2() {
return b._1();
}
public C _3() {
return c._1();
}
public D _4() {
return d._1();
}
public E _5() {
return e._1();
}
public F _6() {
return f._1();
}
public G _7() {
return g._1();
}
public H _8() {
return h._1();
}
};
}
/**
* Returns a function that returns the first element of a product.
*
* @return A function that returns the first element of a product.
*/
public static <A, B, C, D, E, F$, G, H> fj.F<P8<A, B, C, D, E, F$, G, H>, A> __1() {
return P8::_1;
}
/**
* Returns a function that returns the second element of a product.
*
* @return A function that returns the second element of a product.
*/
public static <A, B, C, D, E, F$, G, H> fj.F<P8<A, B, C, D, E, F$, G, H>, B> __2() {
return P8::_2;
}
/**
* Returns a function that returns the third element of a product.
*
* @return A function that returns the third element of a product.
*/
public static <A, B, C, D, E, F$, G, H> fj.F<P8<A, B, C, D, E, F$, G, H>, C> __3() {
return P8::_3;
}
/**
* Returns a function that returns the fourth element of a product.
*
* @return A function that returns the fourth element of a product.
*/
public static <A, B, C, D, E, F$, G, H> fj.F<P8<A, B, C, D, E, F$, G, H>, D> __4() {
return P8::_4;
}
/**
* Returns a function that returns the fifth element of a product.
*
* @return A function that returns the fifth element of a product.
*/
public static <A, B, C, D, E, F$, G, H> fj.F<P8<A, B, C, D, E, F$, G, H>, E> __5() {
return P8::_5;
}
/**
* Returns a function that returns the sixth element of a product.
*
* @return A function that returns the sixth element of a product.
*/
public static <A, B, C, D, E, F$, G, H> fj.F<P8<A, B, C, D, E, F$, G, H>, F$> __6() {
return P8::_6;
}
/**
* Returns a function that returns the seventh element of a product.
*
* @return A function that returns the seventh element of a product.
*/
public static <A, B, C, D, E, F$, G, H> fj.F<P8<A, B, C, D, E, F$, G, H>, G> __7() {
return P8::_7;
}
/**
* Returns a function that returns the eighth element of a product.
*
* @return A function that returns the eighth element of a product.
*/
public static <A, B, C, D, E, F$, G, H> fj.F<P8<A, B, C, D, E, F$, G, H>, H> __8() {
return P8::_8;
}
@Override
public final String toString() {
return Show.p8Show(Show.<A>anyShow(), Show.<B>anyShow(), Show.<C>anyShow(), Show.<D>anyShow(), Show.<E>anyShow(), Show.<F>anyShow(), Show.<G>anyShow(), Show.<H>anyShow()).showS(this);
}
@Override
public final boolean equals(Object other) {
return Equal.equals0(P8.class, this, other,
() -> Equal.p8Equal(Equal.anyEqual(), Equal.anyEqual(), Equal.anyEqual(), Equal.anyEqual(), Equal.anyEqual(), Equal.anyEqual(), Equal.anyEqual(), Equal.anyEqual()));
}
@Override
public final int hashCode() {
return Hash.p8Hash(Hash.<A>anyHash(), Hash.<B>anyHash(), Hash.<C>anyHash(), Hash.<D>anyHash(), Hash.<E>anyHash(), Hash.<F>anyHash(), Hash.<G>anyHash(), Hash.<H>anyHash()).hash(this);
}
}