genawaiter/rc/
iterator.rs1use 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}