diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2014-03-20 21:47:46 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2014-03-20 22:00:52 +0100 |
commit | 1fa46a5a9634f09e4905da2468acf5ea75d6462e (patch) | |
tree | 157c4a5bb237b59090fee56383f9ccafa85dacec /src | |
parent | bcf24ec9ba07408ad9e8745135cc941ac3e76289 (diff) | |
download | scala-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')
-rw-r--r-- | src/library/scala/collection/Iterator.scala | 2 |
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] { |