next-gen 0.0.5

Safe generators on stable Rust.
Documentation
use_prelude!();
use ::core::ops::{Deref, DerefMut};

pub
struct Iter<P> (
    Pin<P>,
)
where
    P : DerefMut,
    P::Target : Generator,
;
impl<P> Iterator for Iter<P>
where
    P : DerefMut,
    P::Target : Generator,
{
    type Item = <
        <P as Deref>::Target
        as
        Generator
    >::Yield;

    fn next (self: &'_ mut Self)
      -> Option<Self::Item>
    {
        match self.0.as_mut().resume() {
            | GeneratorState::Yield(x) => Some(x),
            | GeneratorState::Return(_) => None,
        }
    }
}

impl<'pinned_generator, Item, F : Future> IntoIterator
    for Pin<&'pinned_generator mut GeneratorFn<Item, F>>
{
    type IntoIter = Iter<&'pinned_generator mut GeneratorFn<Item, F>>;
    type Item = Item;

    #[inline]
    fn into_iter (self: Self)
      -> Self::IntoIter
    {
        Iter(self)
    }
}

#[cfg(feature = "alloc")]
impl<Item, F : Future> IntoIterator
    for Pin<::alloc::boxed::Box<GeneratorFn<Item, F>>>
{
    type IntoIter = Iter<::alloc::boxed::Box<GeneratorFn<Item, F>>>;
    type Item = Item;

    #[inline]
    fn into_iter (self: Self)
      -> Self::IntoIter
    {
        Iter(self)
    }
}