diff options
author | Martin Odersky <odersky@gmail.com> | 2010-03-19 17:35:58 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2010-03-19 17:35:58 +0000 |
commit | c059e09cc7fee862e605c4d4d054447bc460aa2a (patch) | |
tree | 3f74ebdfc248e7fa2f7a43151ff0c771a9699909 /src/library/scala/collection/TraversableLike.scala | |
parent | 05c22ec2eed257c7b5e93aa4830a7666831fff48 (diff) | |
download | scala-c059e09cc7fee862e605c4d4d054447bc460aa2a.tar.gz scala-c059e09cc7fee862e605c4d4d054447bc460aa2a.tar.bz2 scala-c059e09cc7fee862e605c4d4d054447bc460aa2a.zip |
Spring cleaning of collection libraries.
If people think some operations can be more lazy, please provide
patches/do changes. Also brought proxies and forwarders into line.
Diffstat (limited to 'src/library/scala/collection/TraversableLike.scala')
-rw-r--r-- | src/library/scala/collection/TraversableLike.scala | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/src/library/scala/collection/TraversableLike.scala b/src/library/scala/collection/TraversableLike.scala index 5ef7b5205a..a09bba625f 100644 --- a/src/library/scala/collection/TraversableLike.scala +++ b/src/library/scala/collection/TraversableLike.scala @@ -518,10 +518,12 @@ self => * }}} * where `x,,1,,, ..., x,,n,,` are the elements of this $coll. */ - def foldRight[B](z: B)(op: (A, B) => B): B = { + def foldRight[B](z: B)(op: (A, B) => B): B = reversed.foldLeft(z)((x, y) => op(y, x)) + + private def reversed: List[A] = { var elems: List[A] = Nil for (x <- this) elems = x :: elems - elems.foldLeft(z)((x, y) => op(y, x)) + elems } /** Applies a binary operator to all elements of this $coll and a start value, going right to left. @@ -625,10 +627,10 @@ self => * @return collection with intermediate results */ def scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { - val (_, b) = foldLeft(z, bf(repr) += z) { (acc, x) => - val next = op(acc._1, x) - (next, acc._2 += next) - } + val b = bf(repr) + var acc = z + b += acc + for (x <- this) { acc = op(acc, x); b += acc } b.result } @@ -645,14 +647,10 @@ self => * @return collection with intermediate results */ def scanRight[B, That](z: B)(op: (A, B) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { - var lst = List(z) - foldRight(z) { (x, acc) => - val next = op(x, acc) - lst ::= next - next - } val b = bf(repr) - for (elem <- lst) b += elem + var acc = z + b += acc + for (x <- reversed) { acc = op(x, acc); b += acc } b.result } @@ -1175,7 +1173,7 @@ self => */ def view = new TraversableView[A, Repr] { protected lazy val underlying = self.repr - override def foreach[B](f: A => B) = self foreach f + override def foreach[U](f: A => U) = self foreach f } /** Creates a non-strict view of a slice of this $coll. |