genawaiter/rc/
iterator.rs

1use crate::{ops::GeneratorState, rc::Gen};
2use std::future::Future;
3
4impl<Y, F: Future<Output = ()>> IntoIterator for Gen<Y, (), F> {
5    type Item = Y;
6    type IntoIter = IntoIter<Y, F>;
7
8    #[must_use]
9    fn into_iter(self) -> Self::IntoIter {
10        IntoIter { generator: self }
11    }
12}
13
14pub struct IntoIter<Y, F: Future<Output = ()>> {
15    generator: Gen<Y, (), F>,
16}
17
18impl<Y, F: Future<Output = ()>> Iterator for IntoIter<Y, F> {
19    type Item = Y;
20
21    fn next(&mut self) -> Option<Self::Item> {
22        match self.generator.resume() {
23            GeneratorState::Yielded(x) => Some(x),
24            GeneratorState::Complete(()) => None,
25        }
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use crate::rc::{Co, Gen};
32    use std::iter::IntoIterator;
33
34    async fn produce(co: Co<i32>) {
35        co.yield_(10).await;
36        co.yield_(20).await;
37    }
38
39    #[test]
40    fn into_iter() {
41        let gen = Gen::new(produce);
42        let items: Vec<_> = gen.into_iter().collect();
43        assert_eq!(items, [10, 20]);
44    }
45
46    #[test]
47    fn for_loop() {
48        let mut sum = 0;
49        for x in Gen::new(produce) {
50            sum += x;
51        }
52        assert_eq!(sum, 30);
53    }
54}