Function pushgen::generators::from_fn[][src]

pub fn from_fn<T, F>(f: F) -> FromFn<F> where
    F: FnMut() -> Option<T>, 
Expand description

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

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

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

Examples

Let’s re-implement the counter generator:

use crate::pushgen::GeneratorExt;

let mut count = 0;
let mut counter = pushgen::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
    }
});
let mut output: Vec<i32> = Vec::new();
counter.for_each(|x| output.push(x));
assert_eq!(output, [1, 2, 3, 4, 5]);