package fj;
/**
* A product-5.
*
* @version %build.number%
*/
public abstract class P5 {
/**
* 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();
/**
* Map the first element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final P5 map1(final F f) {
return new P5() {
public X _1() {
return f.f(P5.this._1());
}
public B _2() {
return P5.this._2();
}
public C _3() {
return P5.this._3();
}
public D _4() {
return P5.this._4();
}
public E _5() {
return P5.this._5();
}
};
}
/**
* Map the second element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final P5 map2(final F f) {
return new P5() {
public A _1() {
return P5.this._1();
}
public X _2() {
return f.f(P5.this._2());
}
public C _3() {
return P5.this._3();
}
public D _4() {
return P5.this._4();
}
public E _5() {
return P5.this._5();
}
};
}
/**
* Map the third element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final P5 map3(final F f) {
return new P5() {
public A _1() {
return P5.this._1();
}
public B _2() {
return P5.this._2();
}
public X _3() {
return f.f(P5.this._3());
}
public D _4() {
return P5.this._4();
}
public E _5() {
return P5.this._5();
}
};
}
/**
* Map the fourth element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final P5 map4(final F f) {
return new P5() {
public A _1() {
return P5.this._1();
}
public B _2() {
return P5.this._2();
}
public C _3() {
return P5.this._3();
}
public X _4() {
return f.f(P5.this._4());
}
public E _5() {
return P5.this._5();
}
};
}
/**
* Map the fifth element of the product.
*
* @param f The function to map with.
* @return A product with the given function applied.
*/
public final P5 map5(final F f) {
return new P5() {
public A _1() {
return P5.this._1();
}
public B _2() {
return P5.this._2();
}
public C _3() {
return P5.this._3();
}
public D _4() {
return P5.this._4();
}
public X _5() {
return f.f(P5.this._5());
}
};
}
/**
* Returns the 1-product projection over the first element.
*
* @return the 1-product projection over the first element.
*/
public final P1 _1_() {
return P5.__1().lazy().f(this);
}
/**
* Returns the 1-product projection over the second element.
*
* @return the 1-product projection over the second element.
*/
public final P1 _2_() {
return P5.__2().lazy().f(this);
}
/**
* Returns the 1-product projection over the third element.
*
* @return the 1-product projection over the third element.
*/
public final P1 _3_() {
return P5.__3().lazy().f(this);
}
/**
* Returns the 1-product projection over the fourth element.
*
* @return the 1-product projection over the fourth element.
*/
public final P1 _4_() {
return P5.__4().lazy().f(this);
}
/**
* Returns the 1-product projection over the fifth element.
*
* @return the 1-product projection over the fifth element.
*/
public final P1 _5_() {
return P5.__5().lazy().f(this);
}
/**
* Provides a memoising P5 that remembers its values.
*
* @return A P5 that calls this P5 once for any given element and remembers the value for subsequent calls.
*/
public final P5 memo() {
return new P5() {
private final P1 a = _1_().memo();
private final P1 b = _2_().memo();
private final P1 c = _3_().memo();
private final P1 d = _4_().memo();
private final P1 e = _5_().memo();
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();
}
};
}
/**
* Returns a function that returns the first element of a product.
*
* @return A function that returns the first element of a product.
*/
public static F, A> __1() {
return new F, A>() {
public A f(final P5 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 F, B> __2() {
return new F, B>() {
public B f(final P5 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 F, C> __3() {
return new F, C>() {
public C f(final P5 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 F, D> __4() {
return new F, D>() {
public D f(final P5 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 F, E> __5() {
return new F, E>() {
public E f(final P5 p) {
return p._5();
}
};
}
}