Mercurial > hg > Members > tatsuki > functionaljava-master > core
diff src/main/java/fj/P6.java @ 0:fe80c1edf1be
add getLoop
author | tatsuki |
---|---|
date | Fri, 20 Mar 2015 21:04:03 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/fj/P6.java Fri Mar 20 21:04:03 2015 +0900 @@ -0,0 +1,434 @@ +package fj; + +/** + * A product-6. + * + * @version %build.number% + */ +@SuppressWarnings({"UnnecessaryFullyQualifiedName"}) +public abstract class P6<A, B, C, D, E, F> { + /** + * 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(); + + /** + * 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> P6<X, B, C, D, E, F> map1(final fj.F<A, X> f) { + return new P6<X, B, C, D, E, F>() { + public X _1() { + return f.f(P6.this._1()); + } + + public B _2() { + return P6.this._2(); + } + + public C _3() { + return P6.this._3(); + } + + public D _4() { + return P6.this._4(); + } + + public E _5() { + return P6.this._5(); + } + + public F _6() { + return P6.this._6(); + } + }; + } + + /** + * 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> P6<A, X, C, D, E, F> map2(final fj.F<B, X> f) { + return new P6<A, X, C, D, E, F>() { + public A _1() { + return P6.this._1(); + } + + public X _2() { + return f.f(P6.this._2()); + } + + public C _3() { + return P6.this._3(); + } + + public D _4() { + return P6.this._4(); + } + + public E _5() { + return P6.this._5(); + } + + public F _6() { + return P6.this._6(); + } + }; + } + + /** + * 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> P6<A, B, X, D, E, F> map3(final fj.F<C, X> f) { + return new P6<A, B, X, D, E, F>() { + public A _1() { + return P6.this._1(); + } + + public B _2() { + return P6.this._2(); + } + + public X _3() { + return f.f(P6.this._3()); + } + + public D _4() { + return P6.this._4(); + } + + public E _5() { + return P6.this._5(); + } + + public F _6() { + return P6.this._6(); + } + }; + } + + /** + * 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> P6<A, B, C, X, E, F> map4(final fj.F<D, X> f) { + return new P6<A, B, C, X, E, F>() { + public A _1() { + return P6.this._1(); + } + + public B _2() { + return P6.this._2(); + } + + public C _3() { + return P6.this._3(); + } + + public X _4() { + return f.f(P6.this._4()); + } + + public E _5() { + return P6.this._5(); + } + + public F _6() { + return P6.this._6(); + } + }; + } + + /** + * 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> P6<A, B, C, D, X, F> map5(final fj.F<E, X> f) { + return new P6<A, B, C, D, X, F>() { + public A _1() { + return P6.this._1(); + } + + public B _2() { + return P6.this._2(); + } + + public C _3() { + return P6.this._3(); + } + + public D _4() { + return P6.this._4(); + } + + public X _5() { + return f.f(P6.this._5()); + } + + public F _6() { + return P6.this._6(); + } + }; + } + + /** + * 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> P6<A, B, C, D, E, X> map6(final fj.F<F, X> f) { + return new P6<A, B, C, D, E, X>() { + public A _1() { + return P6.this._1(); + } + + public B _2() { + return P6.this._2(); + } + + public C _3() { + return P6.this._3(); + } + + public D _4() { + return P6.this._4(); + } + + public E _5() { + return P6.this._5(); + } + + public X _6() { + return f.f(P6.this._6()); + } + }; + } + + /** + * 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(P6.<A, B, C, D, E, F>__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(P6.<A, B, C, D, E, F>__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(P6.<A, B, C, D, E, F>__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(P6.<A, B, C, D, E, F>__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(P6.<A, B, C, D, E, F>__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(P6.<A, B, C, D, E, F>__6()).f(this); + } + + /** + * Provides a memoising P6 that remembers its values. + * + * @return A P6 that calls this P6 once for any given element and remembers the value for subsequent calls. + */ + public final P6<A, B, C, D, E, F> memo() { + P6<A, B, C, D, E, F> self = this; + return new P6<A, B, C, D, E, F>() { + private final P1<A> a = P1.memo(u -> self._1()); + private final P1<B> b = P1.memo(u -> self._2()); + private final P1<C> c = P1.memo(u -> self._3()); + private final P1<D> d = P1.memo(u -> self._4()); + private final P1<E> e = P1.memo(u -> self._5()); + private final P1<F> f = P1.memo(u -> self._6()); + + 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(); + } + }; + } + + + /** + * 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$> fj.F<P6<A, B, C, D, E, F$>, A> __1() { + return new fj.F<P6<A, B, C, D, E, F$>, A>() { + public A f(final P6<A, B, C, D, E, F$> p) { + return p._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$> fj.F<P6<A, B, C, D, E, F$>, B> __2() { + return new fj.F<P6<A, B, C, D, E, F$>, B>() { + public B f(final P6<A, B, C, D, E, F$> p) { + return p._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$> fj.F<P6<A, B, C, D, E, F$>, C> __3() { + return new fj.F<P6<A, B, C, D, E, F$>, C>() { + public C f(final P6<A, B, C, D, E, F$> p) { + return p._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$> fj.F<P6<A, B, C, D, E, F$>, D> __4() { + return new fj.F<P6<A, B, C, D, E, F$>, D>() { + public D f(final P6<A, B, C, D, E, F$> p) { + return p._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$> fj.F<P6<A, B, C, D, E, F$>, E> __5() { + return new fj.F<P6<A, B, C, D, E, F$>, E>() { + public E f(final P6<A, B, C, D, E, F$> p) { + return p._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$> fj.F<P6<A, B, C, D, E, F$>, F$> __6() { + return new fj.F<P6<A, B, C, D, E, F$>, F$>() { + public F$ f(final P6<A, B, C, D, E, F$> p) { + return p._6(); + } + }; + } + + public String toString() { + return Show.p6Show(Show.<A>anyShow(), Show.<B>anyShow(), Show.<C>anyShow(), Show.<D>anyShow(), Show.<E>anyShow(), Show.<F>anyShow()).showS(this); + } + +}