Introduction
Package iter provides basic definitions and operations related to iterators over sequences.
Iterators
An iterator is a function that passes successive elements of a sequence to a callback function, conventionally named yield
. The function stops either when the sequence is finished or when yield
returns false
, indicating to stop the iteration early. This package defines Seq
and Seq2
(pronounced like seek—the first syllable of sequence) as shorthands for iterators that pass 1 or 2 values per sequence element to yield:
Seq2
represents a sequence of paired values, conventionally key-value or index-value pairs.
yield
returns true if the iterator should continue with the next element in the sequence, false if it should stop.
Iterator functions are most often called by a range loop, as in:
Naming Conventions
Iterator functions and methods are named for the sequence being walked:
The iterator method on a collection type is conventionally named All
, because it iterates a sequence of all the values in the collection.
For a type containing multiple possible sequences, the iterator’s name can indicate which sequence is being provided:
If an iterator requires additional configuration, the constructor function can take additional configuration arguments:
If an iterator requires additional configuration, the constructor function can take additional configuration arguments:
When there are multiple possible iteration orders, the method name may indicate that order:
Single-Use Iterators
Most iterators provide the ability to walk an entire sequence: when called, the iterator does any setup necessary to start the sequence, then calls yield
on successive elements of the sequence, and then cleans up before returning. Calling the iterator again, walks the sequence again.
Some iterators break that convention, providing the ability to walk a sequence only once. These single-use iterators typically report values from a data stream that cannot be rewound to start over. Calling the iterator again after stopping early may continue the stream, but calling it again after the sequence is finished will yield no values at all. Doc comments for functions or methods that return single-use iterators should document this fact: