[][src]Macro next_gen::mk_gen

macro_rules! mk_gen {
    (@input
        let [$($mut:tt)?] $var:ident =
            box $generator:tt ( $($args:expr),* $(,)? )
        $(;)?
    ) => { ... };
    (@input
        let [$($mut:tt)?] $var:ident =
            $generator:tt ( $($args:expr),* $(,)? )
        $(;)?
    ) => { ... };
    (
        let mut $($tt:tt)*
    ) => { ... };
    (
        let $($tt:tt)*
    ) => { ... };
}

Instances a generator and pins it (required to be able to poll it).

By default it pins to the stack, but by using box it can pin to the heap (necessary when wanting to return the generator itself).

Usage

mk_gen!(let $(mut)? <varname> = $(box)? <generator fn> (<args>));

Example

use ::next_gen::prelude::*;

#[generator(bool)]
fn toggler (initial: bool)
{
    use ::core::ops::Not;

    let mut current = initial;
    loop {
        yield_!(current);
        current = current.not();
    }
}

mk_gen!(let generator = toggler(true));
// a generator is not an iterator but an iterable:
let mut iterator = generator.into_iter();

assert_eq!(iterator.next(), Some(true));
assert_eq!(iterator.next(), Some(false));
assert_eq!(iterator.next(), Some(true));
assert_eq!(iterator.next(), Some(false));
assert_eq!(iterator.take(10_000).count(), 10_000);

See GeneratorFn for more examples.