summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library/scala/collection/Iterator.scala11
-rw-r--r--test/files/run/t4054.scala25
2 files changed, 36 insertions, 0 deletions
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala
index 5238a66f70..e2252d5aab 100644
--- a/src/library/scala/collection/Iterator.scala
+++ b/src/library/scala/collection/Iterator.scala
@@ -429,6 +429,17 @@ trait Iterator[+A] extends TraversableOnce[A] {
}
}
+ def scanLeft[B](z: B)(op: (B, A) => B): Iterator[B] = new Iterator[B] {
+ var hasNext = true
+ var elem = z
+ def next() = if (hasNext) {
+ val res = elem
+ if (self.hasNext) elem = op(elem, self.next())
+ else hasNext = false
+ res
+ } else Iterator.empty.next()
+ }
+
/** Takes longest prefix of values produced by this iterator that satisfy a predicate.
* @param p The predicate used to test elements.
* @return An iterator returning the values produced by this iterator, until
diff --git a/test/files/run/t4054.scala b/test/files/run/t4054.scala
new file mode 100644
index 0000000000..83a58ef97c
--- /dev/null
+++ b/test/files/run/t4054.scala
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+object Test {
+ def main(args: Array[String]) {
+ val it = Iterator.from(1).map(n => n * n).scanLeft(0)(_+_)
+
+ assert(it.next == 0)
+ assert(it.next == 1)
+ assert(it.next == 5)
+ assert(it.next == 14)
+ assert(it.next == 30)
+ assert(it.next == 55)
+ assert(it.next == 91)
+ assert(it.next == 140)
+ assert(it.next == 204)
+ assert(it.next == 285)
+ assert(it.next == 385)
+ }
+}