Skip to content

Commit c680cc9

Browse files
mkeskellsdwijnand
authored andcommitted
de-duplicate code code
filter and partition is common other than the supplied function
1 parent 37785fa commit c680cc9

File tree

2 files changed

+2
-51
lines changed

2 files changed

+2
-51
lines changed

library/src/scala/collection/immutable/RedBlackTree.scala

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -975,21 +975,6 @@ private[collection] object NewRedBlackTree {
975975
blacken(fk(t))
976976
}
977977

978-
def filterKeys[A, B](t: Tree[A, B], f: A => Boolean, isFlipped: Boolean): Tree[A, B] = if(t eq null) null else {
979-
def fk(t: Tree[A, B]): Tree[A, B] = {
980-
val k = t.key
981-
val l = t.left
982-
val r = t.right
983-
val l2 = if(l eq null) null else fk(l)
984-
val keep = isFlipped ^ f(k)
985-
val r2 = if(r eq null) null else fk(r)
986-
if(!keep) join2(l2, r2)
987-
else if((l2 eq l) && (r2 eq r)) t
988-
else join(l2, k, t.value, r2)
989-
}
990-
blacken(fk(t))
991-
}
992-
993978
def partitionEntries[A, B](t: Tree[A, B], p: (A, B) => Boolean): (Tree[A, B], Tree[A, B]) = if(t eq null) (null, null) else {
994979
var tmpk, tmpd = null: Tree[A, B] // shared vars to avoid returning tuples from fk
995980
def fk(t: Tree[A, B]): Unit = {
@@ -1024,40 +1009,6 @@ private[collection] object NewRedBlackTree {
10241009
(blacken(tmpk), blacken(tmpd))
10251010
}
10261011

1027-
def partitionKeys[A, B](t: Tree[A, B], p: A => Boolean): (Tree[A, B], Tree[A, B]) = if(t eq null) (null, null) else {
1028-
var tmpk, tmpd = null: Tree[A, B] // shared vars to avoid returning tuples from fk
1029-
def fk(t: Tree[A, B]): Unit = {
1030-
val k = t.key
1031-
val v = t.value
1032-
val l = t.left
1033-
val r = t.right
1034-
var l2k, l2d, r2k, r2d = null: Tree[A, B]
1035-
if(l ne null) {
1036-
fk(l)
1037-
l2k = tmpk
1038-
l2d = tmpd
1039-
}
1040-
val keep = p(k)
1041-
if(r ne null) {
1042-
fk(r)
1043-
r2k = tmpk
1044-
r2d = tmpd
1045-
}
1046-
val jk =
1047-
if(!keep) join2(l2k, r2k)
1048-
else if((l2k eq l) && (r2k eq r)) t
1049-
else join(l2k, k, v, r2k)
1050-
val jd =
1051-
if(keep) join2(l2d, r2d)
1052-
else if((l2d eq l) && (r2d eq r)) t
1053-
else join(l2d, k, v, r2d)
1054-
tmpk = jk
1055-
tmpd = jd
1056-
}
1057-
fk(t)
1058-
(blacken(tmpk), blacken(tmpd))
1059-
}
1060-
10611012

10621013
// Based on Stefan Kahrs' Haskell version of Okasaki's Red&Black Trees
10631014
// Constructing Red-Black Trees, Ralf Hinze: [[http://www.cs.ox.ac.uk/ralf.hinze/publications/WAAAPL99b.ps.gz]]

library/src/scala/collection/immutable/TreeSet.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,10 +292,10 @@ final class TreeSet[A] private[immutable] (private[immutable] val tree: RB.Tree[
292292
}
293293

294294
override private[scala] def filterImpl(f: A => Boolean, isFlipped: Boolean) =
295-
newSetOrSelf(RB.filterKeys(tree, f, isFlipped))
295+
newSetOrSelf(RB.filterEntries[A, Any](tree, {(k, _) => isFlipped ^ f(k)}))
296296

297297
override def partition(p: A => Boolean): (TreeSet[A], TreeSet[A]) = {
298-
val (l, r) = RB.partitionKeys(tree, p)
298+
val (l, r) = RB.partitionEntries(tree, {(a:A, _: Any) => p(a)})
299299
(newSetOrSelf(l), newSetOrSelf(r))
300300
}
301301

0 commit comments

Comments
 (0)