Skip to content

Instantly share code, notes, and snippets.

@mitranim
Created July 22, 2017 11:37
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mitranim/8f6285e7d4ccd16c498590b7fb44a271 to your computer and use it in GitHub Desktop.
Save mitranim/8f6285e7d4ccd16c498590b7fb44a271 to your computer and use it in GitHub Desktop.
gen_utils.rs
#![feature(generators, generator_trait, conservative_impl_trait)]
use std::ops::{Generator, State};
pub fn gen_to_iter<A, G: Generator<Return = (), Yield = A>>(gen: G) -> impl Iterator<Item = A> {
GeneratorIter {
state: GeneratorIterState::Pending,
gen,
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct GeneratorIter<G> {
state: GeneratorIterState,
gen: G,
}
#[derive(Debug, PartialEq, Eq)]
enum GeneratorIterState {
Pending,
Empty,
}
impl<G: Generator<Return = ()>> Iterator for GeneratorIter<G> {
type Item = G::Yield;
fn next(&mut self) -> Option<Self::Item> {
match self.state {
GeneratorIterState::Empty => None,
GeneratorIterState::Pending => {
match self.gen.resume() {
State::Yielded(value) => Some(value),
State::Complete(_) => {
self.state = GeneratorIterState::Empty;
None
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment