use crate::fmt;
use crate::ops::{Coroutine, CoroutineState};
use crate::pin::Pin;
#[inline]
#[unstable(feature = "iter_from_coroutine", issue = "43122", reason = "coroutines are unstable")]
pub fn from_coroutine<G: Coroutine<Return = ()> + Unpin>(coroutine: G) -> FromCoroutine<G> {
FromCoroutine(coroutine)
}
#[unstable(feature = "iter_from_coroutine", issue = "43122", reason = "coroutines are unstable")]
#[derive(Clone)]
pub struct FromCoroutine<G>(G);
#[unstable(feature = "iter_from_coroutine", issue = "43122", reason = "coroutines are unstable")]
impl<G: Coroutine<Return = ()> + Unpin> Iterator for FromCoroutine<G> {
type Item = G::Yield;
fn next(&mut self) -> Option<Self::Item> {
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<G> fmt::Debug for FromCoroutine<G> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("FromCoroutine").finish()
}
}