#![feature(generator_trait)]
use std::ops::{Generator, GeneratorState};
struct GeneratorIterator<T> {
generator: T,
}
impl<T: Generator<Return = ()>> Iterator for GeneratorIterator<T> {
type Item = T::Yield;
fn next(&mut self) -> Option<Self::Item> {
match self.generator.resume() {
GeneratorState::Yielded(x) => Some(x),
GeneratorState::Complete(()) => None,
}
}
}
pub fn gen<Item, T: Generator<Yield = Item, Return = ()>>(
generator: T,
) -> impl Iterator<Item = Item> {
GeneratorIterator { generator }
}
fn main() {
println!("Hello, world!");
}
Playground: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=3d9fb14075d8fb9de8dea454fbb663e9
Code
Error message:
The error message hint is unhelpful because
Generatoris already a bound forT. Note thatGenerator::resumetakes aPin<&mut Self>as itsself.