summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@epfl.ch>2008-04-16 19:48:46 +0000
committerLukas Rytz <lukas.rytz@epfl.ch>2008-04-16 19:48:46 +0000
commit55bc1d9fe6724516867066ec5b2afb35116cee14 (patch)
treeae08c3b625a8a121a8a596d1cc08f6769986360b /src/library
parente10538e2012c871c534cd97ea46dd8488d14d627 (diff)
downloadscala-55bc1d9fe6724516867066ec5b2afb35116cee14.tar.gz
scala-55bc1d9fe6724516867066ec5b2afb35116cee14.tar.bz2
scala-55bc1d9fe6724516867066ec5b2afb35116cee14.zip
optimization for streams as proposed in #498
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/Stream.scala11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/library/scala/Stream.scala b/src/library/scala/Stream.scala
index 3b7f7a4bd5..f22e76bcbb 100644
--- a/src/library/scala/Stream.scala
+++ b/src/library/scala/Stream.scala
@@ -424,16 +424,19 @@ trait Stream[+A] extends Seq.Projection[A] {
* @return <code>f(a<sub>0</sub>) ::: ... ::: f(a<sub>n</sub>)</code> if
* this stream is <code>[a<sub>0</sub>, ..., a<sub>n</sub>]</code>.
*/
- override def flatMap[B](f: A => Iterable[B]): Stream[B] =
- if (isEmpty) Stream.empty
+ override def flatMap[B](f: A => Iterable[B]): Stream[B] = {
+ // optimization: drop A's for which f yields no B
+ val fstream = dropWhile(a => f(a) isEmpty)
+ if (fstream isEmpty) Stream.empty
else {
- val s: Stream[B] = f(head) match {
+ val s: Stream[B] = f(fstream.head) match {
case x: Stream[_] => x
case y: List[_] => y.toStream
case z => z.toList.toStream
}
- s append (tail flatMap f)
+ s append (fstream.tail flatMap f)
}
+ }
override def toStream = this