Skip to content
This repository was archived by the owner on Sep 1, 2020. It is now read-only.

Commit 5ebb7bb

Browse files
committed
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.
1 parent 5b02bb4 commit 5ebb7bb

File tree

1 file changed

+12
-15
lines changed

1 file changed

+12
-15
lines changed

src/library/scala/collection/Iterator.scala

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ package scala
1010
package collection
1111

1212
import mutable.ArrayBuffer
13-
import scala.annotation.{ migration, tailrec }
13+
import scala.annotation.migration
1414
import immutable.Stream
1515
import scala.collection.generic.CanBuildFrom
1616
import scala.annotation.unchecked.{ uncheckedVariance => uV }
@@ -582,22 +582,19 @@ trait Iterator[+A] extends TraversableOnce[A] {
582582

583583
// Must be a named class to avoid structural call to finish from trailing iterator
584584
class Leading extends AbstractIterator[A] {
585-
private val lookahead = new mutable.Queue[A]
586-
private var finished = false
587-
private def advance() = !finished && {
588-
if (self.hasNext && p(self.head)) {
589-
lookahead += self.next
590-
true
591-
} else {
592-
finished = true
593-
false
594-
}
585+
private val drained = new mutable.Queue[A]
586+
private var finished = false
587+
def finish(): Unit = {
588+
require(!finished)
589+
finished = true
590+
while (selfish) drained += self.next
595591
}
596-
@tailrec final def finish(): Unit = if (advance()) finish()
597-
def hasNext = lookahead.nonEmpty || advance()
592+
private def selfish = self.hasNext && p(self.head)
593+
def hasNext = if (finished) drained.nonEmpty else selfish
598594
def next() = {
599-
if (!hasNext) empty.next()
600-
else lookahead.dequeue()
595+
if (finished) drained.dequeue()
596+
else if (selfish) self.next()
597+
else empty.next()
601598
}
602599
}
603600
val leading = new Leading

0 commit comments

Comments
 (0)