1use std::{
2 pin::Pin,
3 task::{Context, Poll},
4};
5
6use futures_core::Stream;
7
8use crate::{AsyncGenerator, GeneratorState};
9
10#[derive(Clone)]
34pub struct AsyncIter<G> {
35 gen: G,
36}
37
38impl<G> AsyncIter<G>
39where
40 G: AsyncGenerator<Return = ()>,
41{
42 #[inline]
44 pub fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<G::Yield>> {
45 unsafe {
46 let me = self.get_unchecked_mut();
47 Pin::new_unchecked(&mut me.gen).poll_resume(cx)
48 }
49 .map(|s| match s {
50 GeneratorState::Yielded(val) => Some(val),
51 GeneratorState::Complete(()) => None,
52 })
53 }
54}
55
56impl<G> Stream for AsyncIter<G>
57where
58 G: AsyncGenerator<Return = ()>,
59{
60 type Item = G::Yield;
61
62 #[inline]
63 fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
64 AsyncIter::poll_next(self, cx)
65 }
66}
67
68pub fn async_iter_from<G>(gen: G) -> impl Stream<Item = G::Yield>
70where
71 G: AsyncGenerator<Return = ()>,
72{
73 AsyncIter { gen }
74}
75
76impl<G> From<G> for AsyncIter<G>
77where
78 G: AsyncGenerator<Return = ()>,
79{
80 fn from(gen: G) -> Self {
81 AsyncIter { gen }
82 }
83}