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"), } }