Iterator
Collections and ranges can produce iterators.
At the core is a next() method that yields one item at a time:
fn next(&mut self) -> Option<Self::Item>
Most of today will use higher-order methods built on top of that:
filter, map, sum, product, fold, reduce