| // run-pass |
| |
| #![feature(generators, generator_trait)] |
| |
| use std::ops::{Generator, GeneratorState}; |
| use std::pin::Pin; |
| |
| fn foo(_: &str) -> String { |
| String::new() |
| } |
| |
| fn bar(baz: String) -> impl Generator<(), Yield = String, Return = ()> { |
| move || { |
| yield foo(&baz); |
| } |
| } |
| |
| fn foo2(_: &str) -> Result<String, ()> { |
| Err(()) |
| } |
| |
| fn bar2(baz: String) -> impl Generator<(), Yield = String, Return = ()> { |
| move || { |
| if let Ok(quux) = foo2(&baz) { |
| yield quux; |
| } |
| } |
| } |
| |
| fn main() { |
| assert_eq!( |
| Pin::new(&mut bar(String::new())).resume(()), |
| GeneratorState::Yielded(String::new()) |
| ); |
| assert_eq!(Pin::new(&mut bar2(String::new())).resume(()), GeneratorState::Complete(())); |
| } |