Skip to content

Commit 10c4099

Browse files
committed
impl ++ test. and fix bug
1 parent de014cb commit 10c4099

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

src/main/scala/finger_tree/FingerTree.scala

+11-4
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,19 @@ sealed trait FingerTree[+A] {
8989
es.foldLeft[FingerTree[B]](pr) { case (acc, e) => acc.snoc(e) }
9090
case (pr, Single(f)) =>
9191
es.foldLeft[FingerTree[B]](pr) { case (acc, e) => acc.snoc(e) }.snoc(f)
92+
case (Empty, sf) =>
93+
es.foldRight[FingerTree[B]](sf) { case (e, acc) => acc.cons(e) }
94+
case (Single(r), sf) =>
95+
es.foldRight[FingerTree[B]](sf) { case (e, acc) => acc.cons(e) }.cons(r)
9296
case (Deep(pr, m1, sf1), Deep(pr1, m2, sf)) =>
93-
val esNode = (sf1.toList ++ es ++ pr1.toList).grouped(3).toList.map {
94-
case a :: b :: c :: Nil => Node3(a, b, c)
95-
case a :: b :: Nil => Node2(a, b)
96-
case _ :: Nil | Nil => throw new IllegalArgumentException
97+
def makeNode(xs: List[B]): List[Node[B]] = xs match {
98+
case a :: b :: Nil => Node2(a, b) :: Nil
99+
case a :: b :: c :: Nil => Node3(a, b, c) :: Nil
100+
case a :: b :: res => Node2(a, b) :: makeNode(res)
101+
case _ :: Nil | Nil => throw new IllegalArgumentException
97102
}
103+
104+
val esNode = makeNode(sf1.toList ++ es ++ pr1.toList)
98105
val m = m1.append(esNode, m2)
99106
Deep(pr, m, sf)
100107
}

src/test/scala/finger_tree/FingerTreeTest.scala

+23
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,27 @@ class FingerTreeTest extends FunSuite with DiagrammedAssertions {
6666
}
6767
}
6868

69+
test("++") {
70+
def fromCons(range: Range): FingerTree[Int] = range.foldLeft[FingerTree[Int]](empty) {
71+
case (acc, i) => acc.cons(i)
72+
}
73+
def fromSnoc(range: Range): FingerTree[Int] = range.foldLeft[FingerTree[Int]](empty) {
74+
case (acc, i) => acc.snoc(i)
75+
}
76+
77+
val ft1 = fromSnoc(1 to 5)
78+
val ft2 = fromCons(6 to 10)
79+
// format: off
80+
val expect1 = Deep(One(1),Deep(One(Node2(2,3)),Empty,Three(Node2(4,5),Node2(10,9),Node2(8,7))),One(6))
81+
// format: on
82+
assert(ft1 ++ ft2 === expect1)
83+
84+
val ft10 = fromSnoc(11 to 20)
85+
val ft20 = fromCons(21 to 30)
86+
// format: off
87+
val expect2 = Deep(One(11),Deep(One(Node3(12,13,14)),Deep(One(Node2(Node3(15,16,17),Node2(18,19))),Empty,One(Node3(Node2(20,30),Node2(29,28),Node3(27,26,25)))),One(Node3(24,23,22))),One(21))
88+
// format: on
89+
assert(ft10 ++ ft20 == expect2)
90+
}
91+
6992
}

0 commit comments

Comments
 (0)