summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/collection/TraversableViewLike.scala21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/library/scala/collection/TraversableViewLike.scala b/src/library/scala/collection/TraversableViewLike.scala
index 36fe6251df..03286fef67 100644
--- a/src/library/scala/collection/TraversableViewLike.scala
+++ b/src/library/scala/collection/TraversableViewLike.scala
@@ -82,6 +82,27 @@ trait TraversableViewLike[+A,
trait Transformed[+B] extends TraversableView[B, Coll] with super.Transformed[B] {
def foreach[U](f: B => U): Unit
+ // Methods whose standard implementations use "isEmpty" need to be rewritten
+ // for views, else they will end up traversing twice in a situation like:
+ // xs.view.flatMap(f).headOption
+ override def headOption: Option[B] = {
+ for (x <- this)
+ return Some(x)
+
+ None
+ }
+ override def lastOption: Option[B] = {
+ // (Should be) better than allocating a Some for every element.
+ var empty = true
+ var result: B = null.asInstanceOf[B]
+ for (x <- this) {
+ empty = false
+ result = x
+ }
+ if (empty) None else Some(result)
+ }
+
+ // XXX: As yet not dealt with, tail and init both call isEmpty.
override def stringPrefix = self.stringPrefix
override def toString = viewToString
}