summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorDonna Malayeri <lindydonna@gmail.com>2009-11-23 15:16:25 +0000
committerDonna Malayeri <lindydonna@gmail.com>2009-11-23 15:16:25 +0000
commit3045b84c8c36d25a3936a114e77a2ae1488ec313 (patch)
tree4ae98861ce772d8bec8cb5dc974bee47cce8d904 /src/library
parent85befd69274d53fb2a4e7b9cdbd8fed8f3171e42 (diff)
downloadscala-3045b84c8c36d25a3936a114e77a2ae1488ec313.tar.gz
scala-3045b84c8c36d25a3936a114e77a2ae1488ec313.tar.bz2
scala-3045b84c8c36d25a3936a114e77a2ae1488ec313.zip
Closed #2552.
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/collection/Iterator.scala32
1 files changed, 26 insertions, 6 deletions
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala
index 751d084770..70462cb8d2 100644
--- a/src/library/scala/collection/Iterator.scala
+++ b/src/library/scala/collection/Iterator.scala
@@ -355,10 +355,19 @@ trait Iterator[+A] { self =>
def filter(p: A => Boolean): Iterator[A] = {
val self = buffered
new Iterator[A] {
- private def skip() = while (self.hasNext && !p(self.head)) self.next()
- def hasNext = { skip(); self.hasNext }
- def next() = { skip(); self.next() }
- }
+ var computedHasNext = false
+ private def skip() = {
+ while (self.hasNext && !p(self.head)) self.next()
+ computedHasNext = self.hasNext
+ }
+ def hasNext = { if (!computedHasNext) skip(); computedHasNext }
+ def next() = {
+ if (!computedHasNext)
+ skip()
+ computedHasNext = false
+ self.next()
+ }
+ }
}
/** !!! Temporary, awaiting more general implementation.
@@ -401,8 +410,19 @@ trait Iterator[+A] { self =>
def takeWhile(p: A => Boolean): Iterator[A] = {
val self = buffered
new Iterator[A] {
- def hasNext = { self.hasNext && p(self.head) }
- def next() = (if (hasNext) self else empty).next()
+ var computedHasNext = false
+
+ def hasNext = {
+ val result = computedHasNext || (self.hasNext && p(self.head))
+ computedHasNext = result
+ result
+ }
+
+ def next() = {
+ val result = (if (computedHasNext || hasNext) self else empty).next()
+ computedHasNext = false
+ result
+ }
}
}