async_iter_ext/iter/
sync_iter.rs1use 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 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}