summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2010-06-06 07:52:30 +0000
committerMartin Odersky <odersky@gmail.com>2010-06-06 07:52:30 +0000
commitdd396886d0da88326e5e4772af4d8813360ea8a5 (patch)
tree4465d56a0a33c7e46a3374727ecfeaea10a8b839
parent0e413bc755b95cac9ec1a370f3773848e72bab86 (diff)
downloadscala-dd396886d0da88326e5e4772af4d8813360ea8a5.tar.gz
scala-dd396886d0da88326e5e4772af4d8813360ea8a5.tar.bz2
scala-dd396886d0da88326e5e4772af4d8813360ea8a5.zip
Fixed problem discovered by Paul that views do ...
Fixed problem discovered by Paul that views do not support a filter in for expressions. review by extempore.
-rw-r--r--src/library/scala/collection/TraversableLike.scala8
-rw-r--r--src/library/scala/collection/TraversableViewLike.scala1
-rwxr-xr-xsrc/library/scala/collection/generic/FilterMonadic.scala11
3 files changed, 17 insertions, 3 deletions
diff --git a/src/library/scala/collection/TraversableLike.scala b/src/library/scala/collection/TraversableLike.scala
index 71e9b0f0e9..04d9002eae 100644
--- a/src/library/scala/collection/TraversableLike.scala
+++ b/src/library/scala/collection/TraversableLike.scala
@@ -86,7 +86,9 @@ import immutable.{List, Stream, Nil, ::}
*
* Note: will not terminate for infinite-sized collections.
*/
-trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with TraversableOnce[A] {
+trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr]
+ with FilterMonadic[A, Repr]
+ with TraversableOnce[A] {
self =>
import Traversable.breaks._
@@ -754,12 +756,12 @@ trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with Traversable
* All these operations apply to those elements of this $coll which
* satisfy the predicate `p`.
*/
- def withFilter(p: A => Boolean): WithFilter = new WithFilter(p)
+ def withFilter(p: A => Boolean): FilterMonadic[A, Repr] = new WithFilter(p)
/** A class supporting filtered operations. Instances of this class are returned by
* method `withFilter`.
*/
- class WithFilter(p: A => Boolean) {
+ class WithFilter(p: A => Boolean) extends FilterMonadic[A, Repr] {
/** Builds a new collection by applying a function to all elements of the
* outer $coll containing this `WithFilter` instance that satisfy predicate `p`.
diff --git a/src/library/scala/collection/TraversableViewLike.scala b/src/library/scala/collection/TraversableViewLike.scala
index ae3f6c0e93..7b443e54b8 100644
--- a/src/library/scala/collection/TraversableViewLike.scala
+++ b/src/library/scala/collection/TraversableViewLike.scala
@@ -199,6 +199,7 @@ self =>
}
override def filter(p: A => Boolean): This = newFiltered(p).asInstanceOf[This]
+ override def withFilter(p: A => Boolean): This = newFiltered(p).asInstanceOf[This]
override def partition(p: A => Boolean): (This, This) = (filter(p), filter(!p(_)))
override def init: This = newSliced(0, size - 1).asInstanceOf[This]
override def drop(n: Int): This = newSliced(n max 0, Int.MaxValue).asInstanceOf[This]
diff --git a/src/library/scala/collection/generic/FilterMonadic.scala b/src/library/scala/collection/generic/FilterMonadic.scala
new file mode 100755
index 0000000000..abf2e0355d
--- /dev/null
+++ b/src/library/scala/collection/generic/FilterMonadic.scala
@@ -0,0 +1,11 @@
+package scala.collection.generic
+
+/** A template trait that contains just the `map`, `flatMap`, `foreach` and `withFilter` methods
+ * of trait `TraverableLike`.
+ */
+trait FilterMonadic[+A, +Repr] {
+ def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
+ def flatMap[B, That](f: A => Traversable[B])(implicit bf: CanBuildFrom[Repr, B, That]): That
+ def foreach[U](f: A => U): Unit
+ def withFilter(p: A => Boolean): FilterMonadic[A, Repr]
+}