Iterators generate a series of values, one value at a time on each call to next()
.
An Iterator is considered exhausted, once its has_next()
method returns false
. Thus every call to next()
should be preceeded with a call to has_next()
to check for exhaustiveness.
Given the rules for using Iterators mentioned above, basic usage of an iterator looks like this:
while iterator.has_next() do let elem = iterator.next()? // do something with elem end
The For
-loop provides a more concise way of iteration:
for elem in iterator do // do something with elem end
Iteration using While
is more flexible as it allows to continue iterating if a call to next()
errors. The For
-loop does not allow this.
Iterator implementations need to adhere to the following rules to be considered well-behaved:
has_next()
needs to return false
.has_next()
returned false
it is not allowed to switch back to true
(Unless the Iterator supports rewinding)has_next()
does not change its returned value if next()
has not been called. That means, that between two calls to next()
any number of calls to has_next()
need to return the same value. (Unless the Iterator supports rewinding)next()
erroring does not necessarily denote exhaustiveness.// Generates values from `from` to 0 class ref Countdown is Iterator[USize] var _cur: USize var _has_next: Bool = true new ref create(from: USize) => _cur = from fun ref has_next(): Bool => _has_next fun ref next(): USize => let elem = _cur = _cur - 1 if elem == 0 then _has_next = false end elem
interface ref Iterator[A: A]
Returns true
if this Iterator is not yet exhausted. That means that a value returned from a subsequent call to next()
is a valid part of this iterator.
Returns false
if this Iterator is exhausted.
The behavior of next()
after this function returned false
is undefined, it might throw an error or return values which are not part of this Iterator.
fun ref has_next() : Bool val
Generate the next value.
This might error, which does not necessarily mean that the Iterator is exhausted.
fun ref next() : A ?
© 2016-2018, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/builtin-Iterator