summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library/scala/collection/immutable/ListSet.scala10
-rw-r--r--test/files/run/bug3822.scala6
2 files changed, 12 insertions, 4 deletions
diff --git a/src/library/scala/collection/immutable/ListSet.scala b/src/library/scala/collection/immutable/ListSet.scala
index 136a57c680..cea4d20595 100644
--- a/src/library/scala/collection/immutable/ListSet.scala
+++ b/src/library/scala/collection/immutable/ListSet.scala
@@ -31,9 +31,11 @@ object ListSet extends ImmutableSetFactory[ListSet] {
* temporary space cost, but it's improbable a list backed set could
* become large enough for this to matter given its pricy element lookup.
*/
- class ListSetBuilder[Elem] extends Builder[Elem, ListSet[Elem]] {
- protected val elems = new mutable.ListBuffer[Elem]
- protected val seen = new mutable.HashSet[Elem]
+ class ListSetBuilder[Elem](initial: ListSet[Elem]) extends Builder[Elem, ListSet[Elem]] {
+ def this() = this(empty[Elem])
+ protected val elems = new mutable.ListBuffer[Elem] ++= initial reverse
+ protected val seen = new mutable.HashSet[Elem] ++= initial
+
def +=(x: Elem): this.type = {
if (!seen(x)) {
elems += x
@@ -97,7 +99,7 @@ class ListSet[A] extends Set[A]
*/
override def ++(xs: TraversableOnce[A]): ListSet[A] =
if (xs.isEmpty) this
- else newBuilder ++= this ++= xs result
+ else new ListSet.ListSetBuilder(this) ++= xs result
private[ListSet] def unchecked_+(e: A): ListSet[A] = new Node(e)
private[ListSet] def unchecked_outer: ListSet[A] =
diff --git a/test/files/run/bug3822.scala b/test/files/run/bug3822.scala
index 7401ecbde2..c35804035e 100644
--- a/test/files/run/bug3822.scala
+++ b/test/files/run/bug3822.scala
@@ -7,6 +7,12 @@ object Test {
assert(xs.size == 200002)
assert(xs.sum == 100001)
+
+ val ys = ListSet[Int]()
+ val ys1 = (1 to 12).grouped(3).foldLeft(ys)(_ ++ _)
+ val ys2 = (1 to 12).foldLeft(ys)(_ + _)
+
+ assert(ys1 == ys2)
}
}