Function sp_std::iter::from_fn

1.34.0 · source · []
pub fn from_fn<T, F>(f: F) -> FromFn<F>
Notable traits for FromFn<F>
impl<T, F> Iterator for FromFn<F> where
    F: FnMut() -> Option<T>, 
type Item = T;
where
    F: FnMut() -> Option<T>, 
Expand description

Creates a new iterator where each iteration calls the provided closure F: FnMut() -> Option<T>.

This allows creating a custom iterator with any behavior without using the more verbose syntax of creating a dedicated type and implementing the Iterator trait for it.

Note that the FromFn iterator doesn’t make assumptions about the behavior of the closure, and therefore conservatively does not implement FusedIterator, or override Iterator::size_hint() from its default (0, None).

The closure can use captures and its environment to track state across iterations. Depending on how the iterator is used, this may require specifying the move keyword on the closure.

Examples

Let’s re-implement the counter iterator from module-level documentation:

let mut count = 0;
let counter = std::iter::from_fn(move || {
    // Increment our count. This is why we started at zero.
    count += 1;

    // Check to see if we've finished counting or not.
    if count < 6 {
        Some(count)
    } else {
        None
    }
});
assert_eq!(counter.collect::<Vec<_>>(), &[1, 2, 3, 4, 5]);