Skip to content

Instantly share code, notes, and snippets.

@jakobrs
Last active January 17, 2022 08:46
Show Gist options
  • Save jakobrs/184e506904250fd95c34c4b7ff8bc568 to your computer and use it in GitHub Desktop.
Save jakobrs/184e506904250fd95c34c4b7ff8bc568 to your computer and use it in GitHub Desktop.
#![feature(generator_trait)]
#![feature(generators)]
use std::ops::{Generator, GeneratorState};
use std::pin::Pin;
use futures::pin_mut;
struct GeneratorIteratorImpl<T>(T);
trait GeneratorIterator
where
Self: Generator<(), Return = ()> + Sized,
{
fn iter(self) -> GeneratorIteratorImpl<Self>
where
Self: Unpin;
fn iter_boxed(self) -> GeneratorIteratorImpl<Pin<Box<Self>>>;
}
impl<T> GeneratorIterator for T
where
Self: Generator<(), Return = ()> + Sized,
{
fn iter(self) -> GeneratorIteratorImpl<Self>
where
Self: Unpin,
{
GeneratorIteratorImpl(self)
}
fn iter_boxed(self) -> GeneratorIteratorImpl<Pin<Box<Self>>> {
GeneratorIteratorImpl(Box::pin(self))
}
}
impl<T> Iterator for GeneratorIteratorImpl<T>
where
T: Generator<(), Return = ()> + Unpin,
{
type Item = T::Yield;
fn next(&mut self) -> Option<Self::Item> {
match Pin::new(&mut self.0).resume(()) {
GeneratorState::Yielded(a) => Some(a),
GeneratorState::Complete(()) => None,
}
}
}
fn main() {
let gen = static || {
yield 1;
yield 2;
yield 3;
};
pin_mut!(gen);
for n in gen.iter() {
println!("{n}");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment