fj.data.Enumerator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of functionaljava Show documentation
Show all versions of functionaljava Show documentation
Functional Java is an open source library that supports closures for the Java programming language
package fj.data;
import fj.F;
import static fj.Function.*;
import static fj.data.Option.none;
import static fj.data.Option.some;
import fj.Function;
import fj.Ord;
import static fj.Ord.*;
import fj.Ordering;
import static fj.Ordering.*;
import java.math.BigDecimal;
import java.math.BigInteger;
/**
* Abstracts over a type that may have a successor and/or predecessor value. This implies ordering for that type. A user
* may construct an enumerator with an optimised version for plus
, otherwise a default is implemented using
* the given successor/predecessor implementations.
*
* For any enumerator e, the following laws must satisfy:
*
* - forall a. e.successor(a).forall(\t -> e.predecessor(t).forall(\z -> z == a))
* - forall a. e.predecessor(a).forall(\t -> e.successor(t).forall(\z -> z == a))
* - e.max().forall(\t -> e.successor(t).isNone)
* - e.min().forall(\t -> e.predecessor(t).isNone)
* - forall a n. e.plus(a, 0) == Some(a)
* - forall a n | n > 0. e.plus(a, n) == e.plus(a, n - 1)
* - forall a n | n < 0. e.plus(a, n) == e.plus(a, n + 1)
*
*
* @version %build.number%
*/
public final class Enumerator {
private final F> successor;
private final F> predecessor;
private final Option max;
private final Option min;
private final Ord order;
private final F>> plus;
private Enumerator(final F> successor, final F> predecessor, final Option max,
final Option min, final Ord order, final F>> plus) {
this.successor = successor;
this.predecessor = predecessor;
this.max = max;
this.min = min;
this.order = order;
this.plus = plus;
}
/**
* Returns the potential successor of a value for this enumerator in curried form.
*
* @return The potential successor of a value for this enumerator in curried form.
*/
public F> successor() {
return successor;
}
/**
* Returns the potential successor of a value for this enumerator.
*
* @param a The value to return the successor of.
* @return The potential successor of a value for this enumerator.
*/
public Option successor(final A a) {
return successor.f(a);
}
/**
* Returns the potential predecessor of a value for this enumerator in curried form.
*
* @return The potential predecessor of a value for this enumerator in curried form.
*/
public F> predecessor() {
return predecessor;
}
/**
* Returns the potential predecessor of a value for this enumerator.
*
* @param a The value to return the predecessor of.
* @return The potential predecessor of a value for this enumerator.
*/
public Option predecessor(final A a) {
return predecessor.f(a);
}
/**
* Returns the maximum value for this enumerator if there is one.
*
* @return The maximum value for this enumerator if there is one.
*/
public Option max() {
return max;
}
/**
* Returns the minimum value for this enumerator if there is one.
*
* @return The minimum value for this enumerator if there is one.
*/
public Option min() {
return min;
}
/**
* Returns a function that moves a value along the enumerator a given number of times.
*
* @return A function that moves a value along the enumerator a given number of times.
*/
public F>> plus() {
return plus;
}
/**
* Returns a function that moves a value along the enumerator a given number of times.
*
* @param a The value to begin moving along from.
* @return A function that moves a value along the enumerator a given number of times.
*/
public F> plus(final A a) {
return plus.f(a);
}
/**
* Returns a function that moves a value along the enumerator a given number of times.
*
* @param l The number of times to move along the enumerator.
* @return A function that moves a value along the enumerator a given number of times.
*/
public F> plus(final long l) {
return flip(plus).f(l);
}
/**
* Moves a value along the enumerator a given number of times.
*
* @param a The value to begin moving along from.
* @param l The number of times to move along the enumerator.
* @return A potential value after having moved the given number of times.
*/
public Option plus(final A a, final long l) {
return plus.f(a).f(l);
}
/**
* Returns the ordering for the enumerator.
*
* @return The ordering for the enumerator.
*/
public Ord order() {
return order;
}
/**
* Invariant functor map over this enumerator.
*
* @param f The covariant map.
* @param g The contra-variant map.
* @return An enumerator after the given functions are applied.
*/
public Enumerator xmap(final F f, final F g) {
final F