use std::{
pin::Pin,
task::{Context, Poll},
};
use futures_core::Stream;
use crate::{AsyncGenerator, GeneratorState};
#[derive(Clone)]
pub struct AsyncIter<G> {
gen: G,
}
impl<G> AsyncIter<G>
where
G: AsyncGenerator<Return = ()>,
{
#[inline]
pub fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<G::Yield>> {
unsafe {
let me = self.get_unchecked_mut();
Pin::new_unchecked(&mut me.gen).poll_resume(cx)
}
.map(|s| match s {
GeneratorState::Yielded(val) => Some(val),
GeneratorState::Complete(()) => None,
})
}
}
impl<G> Stream for AsyncIter<G>
where
G: AsyncGenerator<Return = ()>,
{
type Item = G::Yield;
#[inline]
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
AsyncIter::poll_next(self, cx)
}
}
pub fn async_iter_from<G>(gen: G) -> impl Stream<Item = G::Yield>
where
G: AsyncGenerator<Return = ()>,
{
AsyncIter { gen }
}
impl<G> From<G> for AsyncIter<G>
where
G: AsyncGenerator<Return = ()>,
{
fn from(gen: G) -> Self {
AsyncIter { gen }
}
}