1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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 = "std")]
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)
    }
}

#[cfg(feature = "std")]
impl<Item, R> Iterator
    for Pin<::alloc::boxed::Box<dyn Generator<Yield = Item, Return = R> + '_>>
{
    type Item = Item;

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