diff options
author | Donna Malayeri <lindydonna@gmail.com> | 2009-11-23 15:16:25 +0000 |
---|---|---|
committer | Donna Malayeri <lindydonna@gmail.com> | 2009-11-23 15:16:25 +0000 |
commit | 3045b84c8c36d25a3936a114e77a2ae1488ec313 (patch) | |
tree | 4ae98861ce772d8bec8cb5dc974bee47cce8d904 /src/library | |
parent | 85befd69274d53fb2a4e7b9cdbd8fed8f3171e42 (diff) | |
download | scala-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.scala | 32 |
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 + } } } |