1 | use crate::fmt; |
2 | use crate::ops::{Coroutine, CoroutineState}; |
3 | use crate::pin::Pin; |
4 | |
5 | /// Creates a new iterator where each iteration calls the provided coroutine. |
6 | /// |
7 | /// Similar to [`iter::from_fn`]. |
8 | /// |
9 | /// [`iter::from_fn`]: crate::iter::from_fn |
10 | /// |
11 | /// # Examples |
12 | /// |
13 | /// ``` |
14 | /// #![feature(coroutines)] |
15 | /// #![feature(iter_from_coroutine)] |
16 | /// |
17 | /// let it = std::iter::from_coroutine(|| { |
18 | /// yield 1; |
19 | /// yield 2; |
20 | /// yield 3; |
21 | /// }); |
22 | /// let v: Vec<_> = it.collect(); |
23 | /// assert_eq!(v, [1, 2, 3]); |
24 | /// ``` |
25 | #[inline ] |
26 | #[unstable (feature = "iter_from_coroutine" , issue = "43122" , reason = "coroutines are unstable" )] |
27 | pub fn from_coroutine<G: Coroutine<Return = ()> + Unpin>(coroutine: G) -> FromCoroutine<G> { |
28 | FromCoroutine(coroutine) |
29 | } |
30 | |
31 | /// An iterator over the values yielded by an underlying coroutine. |
32 | /// |
33 | /// This `struct` is created by the [`iter::from_coroutine()`] function. See its documentation for |
34 | /// more. |
35 | /// |
36 | /// [`iter::from_coroutine()`]: from_coroutine |
37 | #[unstable (feature = "iter_from_coroutine" , issue = "43122" , reason = "coroutines are unstable" )] |
38 | #[derive (Clone)] |
39 | pub struct FromCoroutine<G>(G); |
40 | |
41 | #[unstable (feature = "iter_from_coroutine" , issue = "43122" , reason = "coroutines are unstable" )] |
42 | impl<G: Coroutine<Return = ()> + Unpin> Iterator for FromCoroutine<G> { |
43 | type Item = G::Yield; |
44 | |
45 | fn next(&mut self) -> Option<Self::Item> { |
46 | match Pin::new(&mut self.0).resume(()) { |
47 | CoroutineState::Yielded(n: >::Yield) => Some(n), |
48 | CoroutineState::Complete(()) => None, |
49 | } |
50 | } |
51 | } |
52 | |
53 | #[unstable (feature = "iter_from_coroutine" , issue = "43122" , reason = "coroutines are unstable" )] |
54 | impl<G> fmt::Debug for FromCoroutine<G> { |
55 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
56 | f.debug_struct(name:"FromCoroutine" ).finish() |
57 | } |
58 | } |
59 | |