async-iter-ext 0.3.0

Async iterator methods and async methods for option and result.
Documentation
use std::{
    fmt::{Debug, Formatter},
    ops::Deref,
    pin::{Pin, pin},
    task::{Context, Poll},
    vec::IntoIter,
};

use crate::iter::AsyncIterator;

pub trait PollSyncIter: AsyncIterator {
    #[inline]
    fn poll_sync_iter(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
    ) -> Poll<SyncIter<IntoIter<Self::Item>>>
    where
        Self: Sized + Unpin,
    {
        // Pin the future so it can be polled.
        let mut pinned_fut = pin!(self.get_mut().sync_iter());

        loop {
            match pinned_fut.as_mut().poll(cx) {
                Poll::Pending => {}
                Poll::Ready(res) => return Poll::Ready(res),
            }
        }
    }
}

pub struct SyncIter<I> {
    iter: I,
}

impl<I> SyncIter<I> {
    pub(crate) fn new(iter: I) -> Self {
        Self { iter }
    }
}

impl<I> Deref for SyncIter<I> {
    type Target = I;

    fn deref(&self) -> &Self::Target {
        &self.iter
    }
}

impl<I> Iterator for SyncIter<I>
where
    I: Iterator,
{
    type Item = I::Item;

    fn next(&mut self) -> Option<Self::Item> {
        self.iter.next()
    }
}

impl<I> Debug for SyncIter<I>
where
    I: Debug,
{
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("SyncIter")
            .field("iter", &self.iter)
            .finish()
    }
}