diff options
author | Lukas Rytz <lukas.rytz@epfl.ch> | 2008-10-16 14:11:39 +0000 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@epfl.ch> | 2008-10-16 14:11:39 +0000 |
commit | 1a3a362db73edfd742994ad972d90382b9cc77ba (patch) | |
tree | fa5a794b572899fddcd04bdbe97f57db73893924 /src/library | |
parent | 6372a8b619768365a036f7955f8edaa46f5960f0 (diff) | |
download | scala-1a3a362db73edfd742994ad972d90382b9cc77ba.tar.gz scala-1a3a362db73edfd742994ad972d90382b9cc77ba.tar.bz2 scala-1a3a362db73edfd742994ad972d90382b9cc77ba.zip |
added patch of #1335
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/Stream.scala | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/library/scala/Stream.scala b/src/library/scala/Stream.scala index 6765ec1db8..1ddabae797 100644 --- a/src/library/scala/Stream.scala +++ b/src/library/scala/Stream.scala @@ -440,17 +440,20 @@ abstract class Stream[+A] extends Seq.Projection[A] { * this stream is <code>[a<sub>0</sub>, ..., a<sub>n</sub>]</code>. */ 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(fstream.head) match { - case x: Stream[_] => x - case y: List[_] => y.toStream - case z => z.toList.toStream + // drops A's for which f yields an empty Iterable[B] + def loop(s: Stream[A]): Stream[B] = { + if (s.isEmpty) + Stream.empty + else { + val i = f(s.head) + if (i isEmpty) + loop(s.tail) + else + i.toStream append loop(s.tail) } - s append (fstream.tail flatMap f) } + + loop(this) } override def toStream = this |