11package fj .data .fingertrees ;
22
3- import fj .F ;
4- import fj .Function ;
5- import fj .P2 ;
3+ import fj .*;
4+ import fj .data .Option ;
65import fj .data .vector .V2 ;
76import fj .data .vector .V3 ;
87import fj .data .vector .V4 ;
@@ -97,54 +96,60 @@ public V measure() {
9796 final Measured <V , A > m = measured ();
9897 final V measure = m .sum (m .measure (a ), v );
9998 final MakeTree <V , A > mk = mkTree (m );
100- return prefix .match (new F <One <V , A >, FingerTree <V , A >>() {
101- public FingerTree <V , A > f (final One <V , A > one ) {
102- return new Deep <V , A >(m , measure , mk .two (a , one .value ()), middle , suffix );
103- }
104- }, new F <Two <V , A >, FingerTree <V , A >>() {
105- public FingerTree <V , A > f (final Two <V , A > two ) {
106- return new Deep <V , A >(m , measure , mk .three (a , two .values ()._1 (), two .values ()._2 ()), middle , suffix );
107- }
108- }, new F <Three <V , A >, FingerTree <V , A >>() {
109- public FingerTree <V , A > f (final Three <V , A > three ) {
110- return new Deep <V , A >(m , measure , mk .four (a , three .values ()._1 (), three .values ()._2 (),
111- three .values ()._3 ()), middle , suffix );
112- }
113- }, new F <Four <V , A >, FingerTree <V , A >>() {
114- public FingerTree <V , A > f (final Four <V , A > four ) {
115- return new Deep <V , A >(m , measure , mk .two (a , four .values ()._1 ()),
116- middle .cons (mk .node3 (four .values ()._2 (), four .values ()._3 (), four .values ()._4 ())),
117- suffix );
118- }
119- });
99+
100+ return prefix .match (
101+ one -> new Deep <>(m , measure , mk .two (a , one .value ()), middle , suffix ),
102+ two -> new Deep <>(m , measure , mk .three (a , two .values ()._1 (), two .values ()._2 ()), middle , suffix ),
103+ three -> new Deep <>(m , measure , mk .four (a , three .values ()._1 (), three .values ()._2 (), three .values ()._3 ()), middle , suffix ),
104+ four -> new Deep <>(m , measure , mk .two (a , four .values ()._1 ()), middle .cons (mk .node3 (four .values ()._2 (), four .values ()._3 (), four .values ()._4 ())), suffix ));
120105 }
121106
122107 public FingerTree <V , A > snoc (final A a ) {
123108 final Measured <V , A > m = measured ();
124109 final V measure = m .sum (m .measure (a ), v );
125110 final MakeTree <V , A > mk = mkTree (m );
126- return suffix .match (new F <One <V , A >, FingerTree <V , A >>() {
127- public FingerTree <V , A > f (final One <V , A > one ) {
128- return new Deep <V , A >(m , measure , prefix , middle , mk .two (one .value (), a ));
129- }
130- }, new F <Two <V , A >, FingerTree <V , A >>() {
131- public FingerTree <V , A > f (final Two <V , A > two ) {
132- return new Deep <V , A >(m , measure , prefix , middle , mk .three (two .values ()._1 (), two .values ()._2 (), a ));
133- }
134- }, new F <Three <V , A >, FingerTree <V , A >>() {
135- public FingerTree <V , A > f (final Three <V , A > three ) {
136- return new Deep <V , A >(m , measure , prefix , middle , mk .four (three .values ()._1 (), three .values ()._2 (),
137- three .values ()._3 (), a ));
138- }
139- }, new F <Four <V , A >, FingerTree <V , A >>() {
140- public FingerTree <V , A > f (final Four <V , A > four ) {
141- return new Deep <V , A >(m , measure , prefix ,
142- middle .snoc (mk .node3 (four .values ()._1 (), four .values ()._2 (), four .values ()._3 ())),
143- mk .two (four .values ()._4 (), a ));
144- }
145- });
111+
112+ return suffix .match (
113+ one -> new Deep <>(m , measure , prefix , middle , mk .two (one .value (), a )),
114+ two -> new Deep <>(m , measure , prefix , middle , mk .three (two .values ()._1 (), two .values ()._2 (), a )),
115+ three -> new Deep <>(m , measure , prefix , middle , mk .four (three .values ()._1 (), three .values ()._2 (), three .values ()._3 (), a )),
116+ four -> new Deep <>(m , measure , prefix , middle .snoc (mk .node3 (four .values ()._1 (), four .values ()._2 (), four .values ()._3 ())), mk .two (four .values ()._4 (), a )));
117+ }
118+
119+ @ Override public A head () {
120+ return prefix .match (
121+ One ::value ,
122+ two -> two .values ()._1 (),
123+ three -> three .values ()._1 (),
124+ four -> four .values ()._1 ());
146125 }
147126
127+ @ Override public A last () {
128+ return suffix .match (
129+ One ::value ,
130+ two -> two .values ()._2 (),
131+ three -> three .values ()._3 (),
132+ four -> four .values ()._4 ());
133+ }
134+
135+ private static final <V , A > FingerTree <V , A > deepL (final Measured <V , A > measured , final Option <Digit <V , A >> lOpt , final FingerTree <V , Node <V , A >> m , final Digit <V , A > r ) {
136+ return lOpt .option (
137+ P .lazy (() -> m .isEmpty () ? r .toTree () : mkTree (measured ).deep (m .head ().toDigit (), m .tail (), r )),
138+ (F <Digit <V , A >, FingerTree <V , A >>) l -> mkTree (measured ).deep (l , m , r )
139+ );
140+ }
141+
142+ private static final <V , A > FingerTree <V , A > deepR (final Measured <V , A > measured , final Option <Digit <V , A >> rOpt , final FingerTree <V , Node <V , A >> m , final Digit <V , A > l ) {
143+ return rOpt .option (
144+ P .lazy (() -> m .isEmpty () ? l .toTree () : mkTree (measured ).deep (l , m .init (), m .last ().toDigit ())),
145+ (F <Digit <V , A >, FingerTree <V , A >>) r -> mkTree (measured ).deep (l , m , r )
146+ );
147+ }
148+
149+ @ Override public FingerTree <V , A > tail () { return deepL (measured (), prefix .tail (), middle , suffix ); }
150+
151+ @ Override public FingerTree <V , A > init () { return deepR (measured (), suffix .init (), middle , prefix ); }
152+
148153 @ Override public FingerTree <V , A > append (final FingerTree <V , A > t ) {
149154 final Measured <V , A > m = measured ();
150155 return t .match (Function .<Empty <V , A >, FingerTree <V , A >>constant (t ), new F <Single <V , A >, FingerTree <V , A >>() {
@@ -159,19 +164,38 @@ public FingerTree<V, A> f(final Deep<V, A> deep) {
159164 });
160165 }
161166
162- @ SuppressWarnings ({"ReturnOfNull" , "IfStatementWithIdenticalBranches" })
167+ @ Override P3 <FingerTree <V , A >, A , FingerTree <V , A >> split1 (final F <V , Boolean > predicate , final V acc ) {
168+ final Measured <V , A > m = measured ();
169+ final V accL = m .sum (acc , prefix .measure ());
170+ if (predicate .f (accL )) {
171+ final P3 <Option <Digit <V , A >>, A , Option <Digit <V , A >>> lxr = prefix .split1 (predicate , accL );
172+ return P .p (lxr ._1 ().option (new Empty <>(m ), Digit ::toTree ), lxr ._2 (), deepL (m , lxr ._3 (), middle , suffix ));
173+ } else {
174+ final V accM = m .sum (accL , middle .measure ());
175+ if (predicate .f (accM )) {
176+ final P3 <FingerTree <V , Node <V , A >>, Node <V , A >, FingerTree <V , Node <V , A >>> mlXsMr = middle .split1 (predicate , accL );
177+ final P3 <Option <Digit <V , A >>, A , Option <Digit <V , A >>> lxr = mlXsMr ._2 ().split1 (predicate , m .sum (accL , mlXsMr ._1 ().measure ()));
178+ return P .p (deepR (m , lxr ._1 (), mlXsMr ._1 (), prefix ), lxr ._2 (), deepL (m , lxr ._3 (), mlXsMr ._3 (), suffix ));
179+ } else {
180+ final P3 <Option <Digit <V , A >>, A , Option <Digit <V , A >>> lxr = suffix .split1 (predicate , accM );
181+ return P .p (deepR (m , lxr ._1 (), middle , prefix ), lxr ._2 (), lxr ._3 ().option (new Empty <>(m ), Digit ::toTree ));
182+ }
183+ }
184+ }
185+
163186 @ Override public P2 <Integer , A > lookup (final F <V , Integer > o , final int i ) {
164187 final int spr = o .f (prefix .measure ());
165- final int spm = o .f (middle .measure ());
166- if (i < spr )
167- return null ; // TODO
168- //return prefix.lookup(o, i);
169- if (i < spm ) {
170- return null ; // TODO
171- /* final P2<Integer, Node<V, A>> p = middle.lookup(o, i - spr);
172- return p._2().lookup(o, p._1()); */
188+ if (i < spr ) {
189+ return prefix .lookup (o , i );
190+ } else {
191+ final int spm = spr + o .f (middle .measure ());
192+ if (i < spm ) {
193+ final P2 <Integer , Node <V , A >> p = middle .lookup (o , i - spr );
194+ return p ._2 ().lookup (o , p ._1 ());
195+ } else {
196+ return suffix .lookup (o , i - spm );
197+ }
173198 }
174- return null ; // TODO suffix.lookup(i - spm);
175199 }
176200
177201 private static <V , A > FingerTree <V , Node <V , A >> addDigits0 (final Measured <V , A > m , final FingerTree <V , Node <V , A >> m1 ,
0 commit comments