asynciter 0.1.0

Asynchronous iterator.
Documentation
use crate::AsyncIterator;

#[derive(Clone, Debug)]
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct Cycle<I> {
    orig: I,
    iter: I,
}

impl<I: Clone> Cycle<I> {
    pub fn new(iter: I) -> Cycle<I> {
        Cycle {
            orig: iter.clone(),
            iter,
        }
    }
}

impl<I: AsyncIterator + Clone> AsyncIterator for Cycle<I> {
    type Item = I::Item;

    #[inline]
    async fn next(&mut self) -> Option<I::Item> {
        match self.iter.next().await {
            None => {
                self.iter = self.orig.clone();
                self.iter.next().await
            }
            y => y,
        }
    }

    #[inline]
    fn size_hint(&self) -> (usize, Option<usize>) {
        // the cycle iterator is either empty or infinite
        match self.orig.size_hint() {
            sz @ (0, Some(0)) => sz,
            (0, _) => (0, None),
            _ => (usize::MAX, None),
        }
    }
}