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(
14 self: Pin<&mut Self>,
15 cx: &mut Context<'_>,
16 ) -> Poll<SyncIter<IntoIter<Self::Item>>>
17 where
18 Self: Sized + Unpin,
19 {
20 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}