diff options
author | Paul Phillips <paulp@improving.org> | 2010-11-29 23:00:07 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2010-11-29 23:00:07 +0000 |
commit | 66a92814a61c62149a49335f65f4189763b43296 (patch) | |
tree | 981508efdd7a29daa12f3e121d9608e441f26ece /src/library/scala/collection/TraversableViewLike.scala | |
parent | 4ec7f11a799444c3758e94b3fdf9fa5c26330577 (diff) | |
download | scala-66a92814a61c62149a49335f65f4189763b43296.tar.gz scala-66a92814a61c62149a49335f65f4189763b43296.tar.bz2 scala-66a92814a61c62149a49335f65f4189763b43296.zip |
The initial implementation of TraversableOnce c...
The initial implementation of TraversableOnce could not supply concrete
methods or even signatures for map and flatMap because they have
different signatures in Iterator and TraversableLike. But we can take
another approach which works out as nicely:
1) Create implicits which install those methods and flatten on
TraversableOnce instances. 2) Generalize the signatures of flatten
and flatMap to work with A => TraversableOnce[B] instead of A =>
Traversable[B].
And voila, you can mix and match Iterators and Traversables in a for
comprehension, map, flatMap, and flatten, without the tedious process
of sprinkling .iterator or .toList around to appease the compiler. No
review.
Diffstat (limited to 'src/library/scala/collection/TraversableViewLike.scala')
-rw-r--r-- | src/library/scala/collection/TraversableViewLike.scala | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/library/scala/collection/TraversableViewLike.scala b/src/library/scala/collection/TraversableViewLike.scala index 7c078ae5d6..a5c2b09141 100644 --- a/src/library/scala/collection/TraversableViewLike.scala +++ b/src/library/scala/collection/TraversableViewLike.scala @@ -108,7 +108,7 @@ self => } trait FlatMapped[B] extends Transformed[B] { - protected[this] val mapping: A => Traversable[B] + protected[this] val mapping: A => TraversableOnce[B] override def foreach[U](f: B => U) { for (x <- self) for (y <- mapping(x)) @@ -164,7 +164,7 @@ self => protected def newForced[B](xs: => Seq[B]): Transformed[B] = new Forced[B] { val forced = xs } protected def newAppended[B >: A](that: Traversable[B]): Transformed[B] = new Appended[B] { val rest = that } protected def newMapped[B](f: A => B): Transformed[B] = new Mapped[B] { val mapping = f } - protected def newFlatMapped[B](f: A => Traversable[B]): Transformed[B] = new FlatMapped[B] { val mapping = f } + protected def newFlatMapped[B](f: A => TraversableOnce[B]): Transformed[B] = new FlatMapped[B] { val mapping = f } protected def newFiltered(p: A => Boolean): Transformed[A] = new Filtered { val pred = p } protected def newSliced(_from: Int, _until: Int): Transformed[A] = new Sliced { val from = _from; val until = _until } protected def newDroppedWhile(p: A => Boolean): Transformed[A] = new DroppedWhile { val pred = p } @@ -186,7 +186,7 @@ self => override def collect[B, That](pf: PartialFunction[A, B])(implicit bf: CanBuildFrom[This, B, That]): That = filter(pf.isDefinedAt).map(pf)(bf) - override def flatMap[B, That](f: A => Traversable[B])(implicit bf: CanBuildFrom[This, B, That]): That = { + override def flatMap[B, That](f: A => TraversableOnce[B])(implicit bf: CanBuildFrom[This, B, That]): That = { newFlatMapped(f).asInstanceOf[That] // was: val b = bf(repr) // if (b.isInstanceOf[NoBuilder[_]]) newFlatMapped(f).asInstanceOf[That] |