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(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<SyncIter<IntoIter<Self::Item>>>
14  where
15    Self: Sized + Unpin,
16  {
17    // Pin the future so it can be polled.
18    let mut pinned_fut = pin!(self.get_mut().sync_iter());
19
20    loop {
21      match pinned_fut.as_mut().poll(cx) {
22        Poll::Pending => {},
23        Poll::Ready(res) => return Poll::Ready(res),
24      }
25    }
26  }
27}
28
29pub struct SyncIter<I> {
30  iter: I,
31}
32
33impl<I> SyncIter<I> {
34  pub(crate) fn new(iter: I) -> Self {
35    Self { iter }
36  }
37}
38
39impl<I> Deref for SyncIter<I> {
40  type Target = I;
41
42  fn deref(&self) -> &Self::Target {
43    &self.iter
44  }
45}
46
47impl<I> Iterator for SyncIter<I>
48where
49  I: Iterator,
50{
51  type Item = I::Item;
52
53  fn next(&mut self) -> Option<Self::Item> {
54    self.iter.next()
55  }
56}
57
58impl<I> Debug for SyncIter<I>
59where
60  I: Debug,
61{
62  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
63    f.debug_struct("SyncIter").field("iter", &self.iter).finish()
64  }
65}