Skip to content

Commit 7e1d3a9

Browse files
committed
Added headOption to Sqq and FingerTree. Added length to FingerTree. Added length property test to Seq and FingerTree
1 parent 5e2374b commit 7e1d3a9

16 files changed

Lines changed: 137 additions & 7 deletions

File tree

core/src/main/java/fj/data/Seq.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ public Seq<A> snoc(final A a) {
100100
*/
101101
public A head() { return ftree.head(); }
102102

103+
public Option<A> headOption() {
104+
return ftree.headOption();
105+
}
106+
103107
/**
104108
* The last element of this sequence. This is an O(1) operation.
105109
*

core/src/main/java/fj/data/fingertrees/Deep.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,12 @@ private static final <V, A> FingerTree<V, A> deepR(final Measured<V, A> measured
195195
}
196196
}
197197

198+
@Override
199+
public int length() {
200+
int midSize = middle.foldLeft((acc, n) -> acc + n.length(), 0);
201+
return prefix.length() + midSize + suffix.length();
202+
}
203+
198204
private static <V, A> FingerTree<V, Node<V, A>> addDigits0(
199205
final Measured<V, A> m, final FingerTree<V, Node<V, A>> m1,
200206
final Digit<V, A> s1, final Digit<V, A> p2,

core/src/main/java/fj/data/fingertrees/Digit.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,7 @@ Option<Digit<V, A>> init() {
159159
abstract P3<Option<Digit<V, A>>, A, Option<Digit<V, A>>> split1(final F<V, Boolean> predicate, final V acc);
160160

161161
public abstract P2<Integer, A> lookup(final F<V, Integer> o, final int i);
162+
163+
public abstract int length();
164+
162165
}

core/src/main/java/fj/data/fingertrees/Empty.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ public final class Empty<V, A> extends FingerTree<V, A> {
3737

3838
@Override public P2<Integer, A> lookup(final F<V, Integer> o, final int i) { throw error("Lookup of empty tree."); }
3939

40-
@Override public <B> B foldRight(final F<A, F<B, B>> aff, final B z) {
40+
@Override
41+
public int length() {
42+
return 0;
43+
}
44+
45+
@Override public <B> B foldRight(final F<A, F<B, B>> aff, final B z) {
4146
return z;
4247
}
4348

core/src/main/java/fj/data/fingertrees/FingerTree.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import fj.data.Option;
55
import fj.data.Seq;
66

7+
import static fj.Monoid.intAdditionMonoid;
8+
79
/**
810
* Provides 2-3 finger trees, a functional representation of persistent sequences supporting access to the ends in
911
* amortized O(1) time. Concatenation and splitting time is O(log n) in the size of the smaller piece.
@@ -158,6 +160,10 @@ public static <V, A> MakeTree<V, A> mkTree(final Measured<V, A> m) {
158160
*/
159161
public abstract A head();
160162

163+
public Option<A> headOption() {
164+
return isEmpty() ? Option.<A>none() : Option.some(head());
165+
}
166+
161167
/**
162168
* The last element of this tree. This is an O(1) operation.
163169
*
@@ -215,4 +221,11 @@ public final P3<FingerTree<V, A>, A, FingerTree<V, A>> split1(final F<V, Boolean
215221
abstract P3<FingerTree<V, A>, A, FingerTree<V, A>> split1(final F<V, Boolean> predicate, final V acc);
216222

217223
public abstract P2<Integer, A> lookup(final F<V, Integer> o, final int i);
224+
225+
public abstract int length();
226+
227+
public static <A> FingerTree<Integer, A> emptyIntAddition() {
228+
return FingerTree.mkTree(FingerTree.<Integer, A>measured(intAdditionMonoid, Function.constant(1))).empty();
229+
}
230+
218231
}

core/src/main/java/fj/data/fingertrees/Four.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,9 @@ public V4<A> values() {
8383
}
8484
}
8585
}
86+
87+
@Override
88+
public int length() {
89+
return 4;
90+
}
8691
}

core/src/main/java/fj/data/fingertrees/Node.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,6 @@ Measured<V, A> measured() {
5858
public abstract P2<Integer, A> lookup(final F<V, Integer> o, final int i);
5959

6060
public abstract <B> B match(final F<Node2<V, A>, B> n2, final F<Node3<V, A>, B> n3);
61+
62+
public abstract int length();
6163
}

core/src/main/java/fj/data/fingertrees/Node2.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,12 @@ public <B> B match(final F<Node2<V, A>, B> n2, final F<Node3<V, A>, B> n3) {
5858
return n2.f(this);
5959
}
6060

61-
public V2<A> toVector() {
61+
@Override
62+
public int length() {
63+
return 2;
64+
}
65+
66+
public V2<A> toVector() {
6267
return as;
6368
}
6469
}

core/src/main/java/fj/data/fingertrees/Node3.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,12 @@ public <B> B match(final F<Node2<V, A>, B> n2, final F<Node3<V, A>, B> n3) {
3434
return n3.f(this);
3535
}
3636

37-
public Digit<V, A> toDigit() {
37+
@Override
38+
public int length() {
39+
return 3;
40+
}
41+
42+
public Digit<V, A> toDigit() {
3843
return new Three<V, A>(measured(), as);
3944
}
4045

core/src/main/java/fj/data/fingertrees/One.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,9 @@ public A value() {
4949
@Override public P2<Integer, A> lookup(final F<V, Integer> o, final int i) {
5050
return P.p(i, a);
5151
}
52+
53+
@Override
54+
public int length() {
55+
return 1;
56+
}
5257
}

0 commit comments

Comments
 (0)