V
- The monoidal type with which to annotate nodes.A
- The type of the tree's elements.public abstract class FingerTree<V,A>
extends java.lang.Object
Seq
for an example.
Based on "Finger trees: a simple general-purpose data structure", by Ralf Hinze and Ross Paterson.Modifier and Type | Method and Description |
---|---|
abstract FingerTree<V,A> |
append(FingerTree<V,A> t)
Appends one finger tree to another.
|
abstract FingerTree<V,A> |
cons(A a)
Adds the given element to this tree as the first element.
|
static <V,A> FingerTree<V,A> |
empty(Monoid<V> m,
F<A,V> f)
Creates an empty finger tree with elements of type A and node annotations
of type V.
|
static <A> FingerTree<java.lang.Integer,A> |
emptyIntAddition() |
static <A> FingerTree<java.lang.Integer,P2<java.lang.Integer,A>> |
emptyIntMax()
Returns a finger tree which combines the integer node annotations with the
maximum function.
|
<B> FingerTree<V,A> |
filter(F<A,java.lang.Boolean> f) |
abstract <B> B |
foldLeft(F<B,F<A,B>> f,
B z)
Folds the tree to the left with the given function and the given initial element.
|
<B> B |
foldLeft(F2<B,A,B> f,
B z) |
abstract <B> B |
foldRight(F<A,F<B,B>> f,
B z)
Folds the tree to the right with the given function and the given initial element.
|
<B> B |
foldRight(F2<A,B,B> f,
B z) |
abstract A |
head()
The first element of this tree.
|
Option<A> |
headOption() |
abstract FingerTree<V,A> |
init()
The tree without the last element.
|
boolean |
isEmpty()
Indicates whether this tree is empty.
|
abstract A |
last()
The last element of this tree.
|
abstract int |
length() |
abstract P2<java.lang.Integer,A> |
lookup(F<V,java.lang.Integer> o,
int i) |
abstract <B> FingerTree<V,B> |
map(F<A,B> f,
Measured<V,B> m)
Maps the given function across this tree, measuring with the given Measured instance.
|
abstract <B> B |
match(F<Empty<V,A>,B> empty,
F<Single<V,A>,B> single,
F<Deep<V,A>,B> deep)
Provides pattern matching on trees.
|
abstract V |
measure()
Returns the sum of this tree's annotations.
|
Measured<V,A> |
measured() |
static <V,A> Measured<V,A> |
measured(Monoid<V> monoid,
F<A,V> measure)
Constructs a Measured instance for the element type, given a monoid and a measuring function.
|
static <V,A> MakeTree<V,A> |
mkTree(Measured<V,A> m)
Returns a builder of trees and tree components that annotates them using the given Measured instance.
|
abstract A |
reduceLeft(F<A,F<A,A>> f)
Folds the tree to the left with the given function.
|
abstract A |
reduceRight(F<A,F<A,A>> f)
Folds the tree to the right with the given function.
|
abstract FingerTree<V,A> |
snoc(A a)
Adds the given element to this tree as the last element.
|
P2<FingerTree<V,A>,FingerTree<V,A>> |
split(F<V,java.lang.Boolean> predicate)
Splits this tree into a pair of subtrees at the point where the given predicate, based on the measure,
changes from
false to true . |
P3<FingerTree<V,A>,A,FingerTree<V,A>> |
split1(F<V,java.lang.Boolean> predicate)
Like
split , but returns the element where pred first holds separately. |
abstract FingerTree<V,A> |
tail()
The tree without the first element.
|
abstract Stream<A> |
toStream() |
<B> B |
uncons(B nil,
F2<A,FingerTree<V,A>,B> cons)
Performs a reduction on this finger tree using the given arguments.
|
public abstract <B> B foldRight(F<A,F<B,B>> f, B z)
f
- A function with which to fold the tree.z
- An initial element to apply to the fold.public abstract A reduceRight(F<A,F<A,A>> f)
f
- A function with which to fold the tree.public abstract <B> B foldLeft(F<B,F<A,B>> f, B z)
f
- A function with which to fold the tree.z
- An initial element to apply to the fold.public abstract A reduceLeft(F<A,F<A,A>> f)
f
- A function with which to fold the tree.public abstract <B> FingerTree<V,B> map(F<A,B> f, Measured<V,B> m)
f
- A function to map across the values of this tree.m
- A measuring with which to annotate the tree.public final <B> FingerTree<V,A> filter(F<A,java.lang.Boolean> f)
public abstract V measure()
public final boolean isEmpty()
public abstract <B> B match(F<Empty<V,A>,B> empty, F<Single<V,A>,B> single, F<Deep<V,A>,B> deep)
empty
- The function to apply to this empty tree.single
- A function to apply if this tree contains a single element.deep
- A function to apply if this tree contains more than one element.public static <V,A> Measured<V,A> measured(Monoid<V> monoid, F<A,V> measure)
monoid
- A monoid for the measures.measure
- A function with which to measure element values.public static <V,A> MakeTree<V,A> mkTree(Measured<V,A> m)
m
- A Measured instance with which to annotate trees, digits, and nodes.public abstract FingerTree<V,A> cons(A a)
a
- The element to add to the front of this tree.public abstract FingerTree<V,A> snoc(A a)
a
- The element to add to the end of this tree.public abstract A head()
public final <B> B uncons(B nil, F2<A,FingerTree<V,A>,B> cons)
nil
- The value to return if this finger tree is empty.cons
- The function to apply to the head and tail of this finger tree if it is not empty.public abstract A last()
public abstract FingerTree<V,A> tail()
public abstract FingerTree<V,A> init()
public abstract FingerTree<V,A> append(FingerTree<V,A> t)
t
- A finger tree to append to this one.public final P2<FingerTree<V,A>,FingerTree<V,A>> split(F<V,java.lang.Boolean> predicate)
false
to true
. This is a O(log(n)) operation.pred
first holds and the subtree
containing element at and after the point where pred
first holds. Empty if pred
never holds.public final P3<FingerTree<V,A>,A,FingerTree<V,A>> split1(F<V,java.lang.Boolean> predicate)
split
, but returns the element where pred
first holds separately.
Throws an error if the tree is empty.public abstract int length()
public static <A> FingerTree<java.lang.Integer,A> emptyIntAddition()
public static <V,A> FingerTree<V,A> empty(Monoid<V> m, F<A,V> f)
m
- A monoid to combine node annotationsf
- Function to convert node element to annotation.public static <A> FingerTree<java.lang.Integer,P2<java.lang.Integer,A>> emptyIntMax()