summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/Iterator.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2014-03-20 21:47:46 +0100
committerJason Zaugg <jzaugg@gmail.com>2014-03-20 22:00:52 +0100
commit1fa46a5a9634f09e4905da2468acf5ea75d6462e (patch)
tree157c4a5bb237b59090fee56383f9ccafa85dacec /src/library/scala/collection/Iterator.scala
parentbcf24ec9ba07408ad9e8745135cc941ac3e76289 (diff)
downloadscala-1fa46a5a9634f09e4905da2468acf5ea75d6462e.tar.gz
scala-1fa46a5a9634f09e4905da2468acf5ea75d6462e.tar.bz2
scala-1fa46a5a9634f09e4905da2468acf5ea75d6462e.zip
SI-8428 Fix regression in iterator concatenation
Regressed in e3ddb2d7, which introduced `ConcatIterator` to avoid super-linear runtime on chains of concatenated iterators. `ConcatIterator` maintains a queue of thunks for the remaining iterators. Both `next` and `hasNext` delegate to `advance`, which evaluates the thunks and discards any empty iterators from the start of the queue. The first non-empty iterator is stored in the var `current`. It also overrides `++`, and creates a new `ConcatIterator` with the given `that` as an extra element in the queue. However, it failed to copy `current` across, which led to data loss.
Diffstat (limited to 'src/library/scala/collection/Iterator.scala')
-rw-r--r--src/library/scala/collection/Iterator.scala2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala
index 01a0aa3b51..3d379bfa95 100644
--- a/src/library/scala/collection/Iterator.scala
+++ b/src/library/scala/collection/Iterator.scala
@@ -185,7 +185,7 @@ object Iterator {
def next() = if (hasNext) current.next else Iterator.empty.next
override def ++[B >: A](that: => GenTraversableOnce[B]): Iterator[B] =
- new ConcatIterator(queue :+ (() => that.toIterator))
+ new ConcatIterator((() => current) +: (queue :+ (() => that.toIterator)))
}
private[scala] final class JoinIterator[+A](lhs: Iterator[A], that: => GenTraversableOnce[A]) extends Iterator[A] {