package fj.data.fingertrees;
import fj.F;
import fj.P;
import fj.P2;
import fj.P3;
import fj.Show;
import fj.data.Option;
import fj.data.Stream;
import static fj.data.Option.none;
/**
* A single-element prefix or suffix of a finger tree.
*/
public final class One<V, A> extends Digit<V, A> {
private final A a;
One(final Measured<V, A> m, final A a) {
super(m);
this.a = a;
}
public <B> B foldRight(final F<A, F<B, B>> aff, final B z) {
return aff.f(a).f(z);
}
public <B> B foldLeft(final F<B, F<A, B>> bff, final B z) {
return bff.f(z).f(a);
}
@Override public <B> B match(
final F<One<V, A>, B> one, final F<Two<V, A>, B> two, final F<Three<V, A>, B> three,
final F<Four<V, A>, B> four) {
return one.f(this);
}
/**
* Returns the single element in this digit.
*
* @return the single element in this digit.
*/
public A value() {
return a;
}
@Override P3<Option<Digit<V, A>>, A, Option<Digit<V, A>>> split1(final F<V, Boolean> predicate, final V acc) {
return P.p(none(), a, none());
}
@Override public P2<Integer, A> lookup(final F<V, Integer> o, final int i) {
return P.p(i, a);
}
@Override
public int length() {
return 1;
}
public String toString() {
return Show.digitShow(Show.<V>anyShow(), Show.<A>anyShow()).showS(this);
}
public Stream<A> toStream() {
return Stream.single(a);
}
}