summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSom Snytt <som.snytt@gmail.com>2015-05-27 14:21:58 -0700
committerSom Snytt <som.snytt@gmail.com>2015-05-27 14:37:08 -0700
commit5ebb7bb3bfc0e5152a707e693379d5ac5b5d9355 (patch)
tree8e3ef952c748608ee49fa9c81f99d6c94dd3c143
parent5b02bb4f8993f8e09ff1223fbdd4acf78eabd964 (diff)
downloadscala-5ebb7bb3bfc0e5152a707e693379d5ac5b5d9355.tar.gz
scala-5ebb7bb3bfc0e5152a707e693379d5ac5b5d9355.tar.bz2
scala-5ebb7bb3bfc0e5152a707e693379d5ac5b5d9355.zip
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.
-rw-r--r--src/library/scala/collection/Iterator.scala27
1 files 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