summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/TraversableViewLike.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-12-06 04:16:21 -0800
committerJason Zaugg <jzaugg@gmail.com>2013-12-06 04:16:21 -0800
commit49f7414a1ed42f00f0b5e703d01d0327eb103943 (patch)
treec74365071ab2e9cfcf938d6c84a41e905b07bd25 /src/library/scala/collection/TraversableViewLike.scala
parent636307b9ba35e856f34684cce8620983aa1ba702 (diff)
parent51cd47491e979b10b5d86992dd2e3efd08f7e214 (diff)
downloadscala-49f7414a1ed42f00f0b5e703d01d0327eb103943.tar.gz
scala-49f7414a1ed42f00f0b5e703d01d0327eb103943.tar.bz2
scala-49f7414a1ed42f00f0b5e703d01d0327eb103943.zip
Merge pull request #3191 from retronym/ticket/deprecate-par-view
Remove parallel collection views and, with them, Gen*View
Diffstat (limited to 'src/library/scala/collection/TraversableViewLike.scala')
-rw-r--r--src/library/scala/collection/TraversableViewLike.scala116
1 files changed, 99 insertions, 17 deletions
diff --git a/src/library/scala/collection/TraversableViewLike.scala b/src/library/scala/collection/TraversableViewLike.scala
index d56ecb16ed..5926c69ebf 100644
--- a/src/library/scala/collection/TraversableViewLike.scala
+++ b/src/library/scala/collection/TraversableViewLike.scala
@@ -70,27 +70,39 @@ trait ViewMkString[+A] {
trait TraversableViewLike[+A,
+Coll,
+This <: TraversableView[A, Coll] with TraversableViewLike[A, Coll, This]]
- extends Traversable[A] with TraversableLike[A, This] with ViewMkString[A] with GenTraversableViewLike[A, Coll, This]
+ extends Traversable[A] with TraversableLike[A, This] with ViewMkString[A]
{
self =>
- override protected[this] def newBuilder: Builder[A, This] =
- throw new UnsupportedOperationException(this+".newBuilder")
-
protected def underlying: Coll
protected[this] def viewIdentifier: String = ""
protected[this] def viewIdString: String = ""
+ def viewToString = stringPrefix + viewIdString + "(...)"
override def stringPrefix = "TraversableView"
+ override protected[this] def newBuilder: Builder[A, This] =
+ throw new UnsupportedOperationException(this+".newBuilder")
+
def force[B >: A, That](implicit bf: CanBuildFrom[Coll, B, That]) = {
val b = bf(underlying)
b ++= this
b.result()
}
- trait Transformed[+B] extends TraversableView[B, Coll] with super.Transformed[B] {
+ /** Explicit instantiation of the `Transformed` trait to reduce class file size in subclasses. */
+ private[collection] abstract class AbstractTransformed[+B] extends Traversable[B] with Transformed[B]
+
+
+ /** The implementation base trait of this view.
+ * This trait and all its subtraits has to be re-implemented for each
+ * ViewLike class.
+ */
+ trait Transformed[+B] extends TraversableView[B, Coll] {
def foreach[U](f: B => U): Unit
+ lazy val underlying = self.underlying
+ final override protected[this] def viewIdString = self.viewIdString + viewIdentifier
+
// 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
@@ -116,29 +128,99 @@ trait TraversableViewLike[+A,
override def toString = viewToString
}
- /** Explicit instantiation of the `Transformed` trait to reduce class file size in subclasses. */
- private[collection] abstract class AbstractTransformed[+B] extends Traversable[B] with Transformed[B]
-
- trait EmptyView extends Transformed[Nothing] with super.EmptyView
+ trait EmptyView extends Transformed[Nothing] {
+ final override def isEmpty = true
+ final override def foreach[U](f: Nothing => U): Unit = ()
+ }
/** A fall back which forces everything into a vector and then applies an operation
* on it. Used for those operations which do not naturally lend themselves to a view
*/
- trait Forced[B] extends Transformed[B] with super.Forced[B]
+ trait Forced[B] extends Transformed[B] {
+ protected[this] val forced: GenSeq[B]
+ def foreach[U](f: B => U) = forced foreach f
+ final override protected[this] def viewIdentifier = "C"
+ }
- trait Sliced extends Transformed[A] with super.Sliced
+ trait Sliced extends Transformed[A] {
+ protected[this] val endpoints: SliceInterval
+ protected[this] def from = endpoints.from
+ protected[this] def until = endpoints.until
+ // protected def newSliced(_endpoints: SliceInterval): Transformed[A] =
+ // self.newSliced(endpoints.recalculate(_endpoints))
+
+ def foreach[U](f: A => U) {
+ var index = 0
+ for (x <- self) {
+ if (from <= index) {
+ if (until <= index) return
+ f(x)
+ }
+ index += 1
+ }
+ }
+ final override protected[this] def viewIdentifier = "S"
+ }
- trait Mapped[B] extends Transformed[B] with super.Mapped[B]
+ trait Mapped[B] extends Transformed[B] {
+ protected[this] val mapping: A => B
+ def foreach[U](f: B => U) {
+ for (x <- self)
+ f(mapping(x))
+ }
+ final override protected[this] def viewIdentifier = "M"
+ }
- trait FlatMapped[B] extends Transformed[B] with super.FlatMapped[B]
+ trait FlatMapped[B] extends Transformed[B] {
+ protected[this] val mapping: A => GenTraversableOnce[B]
+ def foreach[U](f: B => U) {
+ for (x <- self)
+ for (y <- mapping(x).seq)
+ f(y)
+ }
+ final override protected[this] def viewIdentifier = "N"
+ }
- trait Appended[B >: A] extends Transformed[B] with super.Appended[B]
+ trait Appended[B >: A] extends Transformed[B] {
+ protected[this] val rest: GenTraversable[B]
+ def foreach[U](f: B => U) {
+ self foreach f
+ rest foreach f
+ }
+ final override protected[this] def viewIdentifier = "A"
+ }
- trait Filtered extends Transformed[A] with super.Filtered
+ trait Filtered extends Transformed[A] {
+ protected[this] val pred: A => Boolean
+ def foreach[U](f: A => U) {
+ for (x <- self)
+ if (pred(x)) f(x)
+ }
+ final override protected[this] def viewIdentifier = "F"
+ }
- trait TakenWhile extends Transformed[A] with super.TakenWhile
+ trait TakenWhile extends Transformed[A] {
+ protected[this] val pred: A => Boolean
+ def foreach[U](f: A => U) {
+ for (x <- self) {
+ if (!pred(x)) return
+ f(x)
+ }
+ }
+ final override protected[this] def viewIdentifier = "T"
+ }
- trait DroppedWhile extends Transformed[A] with super.DroppedWhile
+ trait DroppedWhile extends Transformed[A] {
+ protected[this] val pred: A => Boolean
+ def foreach[U](f: A => U) {
+ var go = false
+ for (x <- self) {
+ if (!go && !pred(x)) go = true
+ if (go) f(x)
+ }
+ }
+ final override protected[this] def viewIdentifier = "D"
+ }
override def ++[B >: A, That](xs: GenTraversableOnce[B])(implicit bf: CanBuildFrom[This, B, That]): That = {
newAppended(xs.seq.toTraversable).asInstanceOf[That]