diff options
author | Martin Odersky <odersky@gmail.com> | 2010-06-06 07:52:30 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2010-06-06 07:52:30 +0000 |
commit | dd396886d0da88326e5e4772af4d8813360ea8a5 (patch) | |
tree | 4465d56a0a33c7e46a3374727ecfeaea10a8b839 | |
parent | 0e413bc755b95cac9ec1a370f3773848e72bab86 (diff) | |
download | scala-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.scala | 8 | ||||
-rw-r--r-- | src/library/scala/collection/TraversableViewLike.scala | 1 | ||||
-rwxr-xr-x | src/library/scala/collection/generic/FilterMonadic.scala | 11 |
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] +} |