diff options
author | Lukas Rytz <lukas.rytz@epfl.ch> | 2008-04-16 19:48:46 +0000 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@epfl.ch> | 2008-04-16 19:48:46 +0000 |
commit | 55bc1d9fe6724516867066ec5b2afb35116cee14 (patch) | |
tree | ae08c3b625a8a121a8a596d1cc08f6769986360b | |
parent | e10538e2012c871c534cd97ea46dd8488d14d627 (diff) | |
download | scala-55bc1d9fe6724516867066ec5b2afb35116cee14.tar.gz scala-55bc1d9fe6724516867066ec5b2afb35116cee14.tar.bz2 scala-55bc1d9fe6724516867066ec5b2afb35116cee14.zip |
optimization for streams as proposed in #498
-rw-r--r-- | src/library/scala/Stream.scala | 11 |
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 |