summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@epfl.ch>2008-10-16 14:11:39 +0000
committerLukas Rytz <lukas.rytz@epfl.ch>2008-10-16 14:11:39 +0000
commit1a3a362db73edfd742994ad972d90382b9cc77ba (patch)
treefa5a794b572899fddcd04bdbe97f57db73893924 /src/library
parent6372a8b619768365a036f7955f8edaa46f5960f0 (diff)
downloadscala-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.scala21
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