Skip to main content

async_iter_ext/iter/
sync_iter.rs

1use std::{
2    fmt::{Debug, Formatter},
3    ops::Deref,
4    pin::{Pin, pin},
5    task::{Context, Poll},
6    vec::IntoIter,
7};
8
9use crate::iter::AsyncIterator;
10
11pub trait PollSyncIter: AsyncIterator {
12    #[inline]
13    fn poll_sync_iter(
14        self: Pin<&mut Self>,
15        cx: &mut Context<'_>,
16    ) -> Poll<SyncIter<IntoIter<Self::Item>>>
17    where
18        Self: Sized + Unpin,
19    {
20        // Pin the future so it can be polled.
21        let mut pinned_fut = pin!(self.get_mut().sync_iter());
22
23        loop {
24            match pinned_fut.as_mut().poll(cx) {
25                Poll::Pending => {}
26                Poll::Ready(res) => return Poll::Ready(res),
27            }
28        }
29    }
30}
31
32pub struct SyncIter<I> {
33    iter: I,
34}
35
36impl<I> SyncIter<I> {
37    pub(crate) fn new(iter: I) -> Self {
38        Self { iter }
39    }
40}
41
42impl<I> Deref for SyncIter<I> {
43    type Target = I;
44
45    fn deref(&self) -> &Self::Target {
46        &self.iter
47    }
48}
49
50impl<I> Iterator for SyncIter<I>
51where
52    I: Iterator,
53{
54    type Item = I::Item;
55
56    fn next(&mut self) -> Option<Self::Item> {
57        self.iter.next()
58    }
59}
60
61impl<I> Debug for SyncIter<I>
62where
63    I: Debug,
64{
65    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
66        f.debug_struct("SyncIter")
67            .field("iter", &self.iter)
68            .finish()
69    }
70}