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
use_prelude!();

pub
struct Iter<
    'pinned_generator,
    'item_slot : 'pinned_generator,
    Item,
    F : Future<Output = ()>,
> (
    Pin<&'pinned_generator mut Generator<'item_slot, Item, F>>,
);

impl<
    'pinned_generator,
    'item_slot : 'pinned_generator,
    Item,
    F : Future<Output = ()>,
> Iterator for Iter<'pinned_generator, 'item_slot, Item, F>
{
    type Item = Item;

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

impl<
    'pinned_generator,
    'item_slot : 'pinned_generator,
    Item,
    F : Future<Output = ()>,
> IntoIterator for Pin<&'pinned_generator mut Generator<'item_slot, Item, F>>
{
    type IntoIter = Iter<'pinned_generator, 'item_slot, Item, F>;
    type Item = Item;

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