use crate::fmt; use crate::ops::{Coroutine, CoroutineState}; use crate::pin::Pin; /// Creates a new iterator where each iteration calls the provided coroutine. /// /// Similar to [`iter::from_fn`]. /// /// [`iter::from_fn`]: crate::iter::from_fn /// /// # Examples /// /// ``` /// #![cfg_attr(bootstrap, feature(generators))] /// #![cfg_attr(not(bootstrap), feature(coroutines))] /// #![feature(iter_from_coroutine)] /// /// let it = std::iter::from_coroutine(|| { /// yield 1; /// yield 2; /// yield 3; /// }); /// let v: Vec<_> = it.collect(); /// assert_eq!(v, [1, 2, 3]); /// ``` #[inline] #[unstable(feature = "iter_from_coroutine", issue = "43122", reason = "coroutines are unstable")] pub fn from_coroutine + Unpin>(coroutine: G) -> FromCoroutine { FromCoroutine(coroutine) } /// An iterator over the values yielded by an underlying coroutine. /// /// This `struct` is created by the [`iter::from_coroutine()`] function. See its documentation for /// more. /// /// [`iter::from_coroutine()`]: from_coroutine #[unstable(feature = "iter_from_coroutine", issue = "43122", reason = "coroutines are unstable")] #[derive(Clone)] pub struct FromCoroutine(G); #[unstable(feature = "iter_from_coroutine", issue = "43122", reason = "coroutines are unstable")] impl + Unpin> Iterator for FromCoroutine { type Item = G::Yield; fn next(&mut self) -> Option { match Pin::new(&mut self.0).resume(()) { CoroutineState::Yielded(n) => Some(n), CoroutineState::Complete(()) => None, } } } #[unstable(feature = "iter_from_coroutine", issue = "43122", reason = "coroutines are unstable")] impl fmt::Debug for FromCoroutine { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("FromCoroutine").finish() } }