From 5ebb7bb3bfc0e5152a707e693379d5ac5b5d9355 Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Wed, 27 May 2015 14:21:58 -0700 Subject: SI-9332 Iterator.span simplified The queue is only used when the prefix is drained by finish. Since a finished flag has been introduced, distinguish between the drained state and using the underlying (buffered) iterator. --- src/library/scala/collection/Iterator.scala | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala index 0f6ae47e89..c9037eb3e3 100644 --- a/src/library/scala/collection/Iterator.scala +++ b/src/library/scala/collection/Iterator.scala @@ -10,7 +10,7 @@ package scala package collection import mutable.ArrayBuffer -import scala.annotation.{ migration, tailrec } +import scala.annotation.migration import immutable.Stream import scala.collection.generic.CanBuildFrom import scala.annotation.unchecked.{ uncheckedVariance => uV } @@ -582,22 +582,19 @@ trait Iterator[+A] extends TraversableOnce[A] { // Must be a named class to avoid structural call to finish from trailing iterator class Leading extends AbstractIterator[A] { - private val lookahead = new mutable.Queue[A] - private var finished = false - private def advance() = !finished && { - if (self.hasNext && p(self.head)) { - lookahead += self.next - true - } else { - finished = true - false - } + private val drained = new mutable.Queue[A] + private var finished = false + def finish(): Unit = { + require(!finished) + finished = true + while (selfish) drained += self.next } - @tailrec final def finish(): Unit = if (advance()) finish() - def hasNext = lookahead.nonEmpty || advance() + private def selfish = self.hasNext && p(self.head) + def hasNext = if (finished) drained.nonEmpty else selfish def next() = { - if (!hasNext) empty.next() - else lookahead.dequeue() + if (finished) drained.dequeue() + else if (selfish) self.next() + else empty.next() } } val leading = new Leading -- cgit v1.2.3