The following example demonstrates how to implement a Rust-function implementing a generator (unstable feature in nightly compiler)
#![feature(generators, generator_trait)]
use std::ops::{Generator, GeneratorState};
use std::pin::Pin;
fn generator() -> impl Generator<
Yield=(),
Return=()>
{
let generator = || {
println!("2");
yield;
println!("4");
};
generator
}
#[derive(Debug, Clone)]
enum MyError {
Fault
}
fn generator2() -> impl Generator<
Yield=Result<u32, MyError>,
Return=&'static str>
{
let generator = || {
yield Ok(1);
yield Err(MyError::Fault);
return "foo";
};
generator
}
fn main() {
let mut generator = generator();
println!("1");
Pin::new(&mut generator).resume(());
println!("3");
Pin::new(&mut generator).resume(());
println!("5");
println!("-------");
let mut generator2 = generator2();
match Pin::new(&mut generator2).resume(()) {
GeneratorState::Yielded(val) => { println!("{:?}", val); }
_ => panic!("unexpected value from resume"),
}
match Pin::new(&mut generator2).resume(()) {
GeneratorState::Yielded(val) => { println! ("{:?}", val); }
_ => panic!("unexpected value from resume"),
}
match Pin::new(&mut generator2).resume(()) {
GeneratorState::Complete(val) => { println!("{}", val); }
_ => panic!("unexpected value from resume"),
}
}