simple_generators 0.2.1

making work with generators simpler
Documentation
#![feature(coroutines, coroutine_trait, stmt_expr_attributes)]

use simple_generators::*;

#[test]
fn test_macro() {
    let sum: u64 = gen_macro(10).sum();
    assert_eq!(sum, 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9);
}

#[test]
fn test_macro_lifetime() {
    let sum: u64 = Foo {
        vec: vec![10, 20, 30],
    }
    .test_gen()
    .sum();
    assert_eq!(sum, 10 + 20 + 30);
}

#[test]
fn test_iter() {
    let sum: u64 = gen_iter(10).sum();
    assert_eq!(sum, 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9);
}

#[generator]
fn gen_macro(n: u64) -> impl Iterator<Item = u64> {
    let mut num = 0;
    while num < n {
        yield num;
        num += 1;
    }
}

fn gen_iter(n: u64) -> impl Iterator<Item = u64> {
    (#[coroutine]
    move || {
        let mut num = 0;
        while num < n {
            yield num;
            num += 1;
        }
    })
    .iter()
}

fn gen_adapter(n: u64) -> impl Iterator<Item = u64> {
    GeneratorIteratorAdapter(
        #[coroutine]
        move || {
            let mut num = 0;
            while num < n {
                yield num;
                num += 1;
            }
        },
    )
}

struct Foo {
    vec: Vec<u64>,
}

impl Foo {
    #[generator]
    fn test_gen<'a>(&'a self) -> impl Iterator<Item = u64> + 'a {
        for item in &self.vec {
            yield *item;
        }
    }
}