asynciter 0.1.0

Asynchronous iterator.
Documentation
use crate::AsyncIterator;

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

impl<I> Fuse<I> {
    #[inline]
    pub fn new(inner: I) -> Fuse<I> {
        Self { inner: Some(inner) }
    }
}

impl<I> AsyncIterator for Fuse<I>
where
    I: AsyncIterator,
{
    type Item = I::Item;

    async fn next(&mut self) -> Option<I::Item> {
        match self.inner.take() {
            Some(mut it) => match it.next().await {
                Some(val) => {
                    self.inner = Some(it);
                    Some(val)
                }
                None => None,
            },
            None => None,
        }
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        match self.inner {
            Some(ref inner) => inner.size_hint(),
            None => (0, Some(0)),
        }
    }
}