asynciter 0.1.0

Asynchronous iterator.
Documentation
use std::{fmt::Debug, future::Future};

use crate::AsyncIterator;

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

impl<I: AsyncIterator + Debug, F> Debug for FilterMap<I, F> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("FilterMap")
            .field("inner", &self.inner)
            .finish()
    }
}

impl<I, F> FilterMap<I, F> {
    #[inline]
    pub fn new(inner: I, operation: F) -> FilterMap<I, F> {
        Self { inner, operation }
    }
}

impl<I, F, B> AsyncIterator for FilterMap<I, F>
where
    I: AsyncIterator,
    F: FnMut(I::Item) -> Option<B>,
{
    type Item = B;

    fn next(&mut self) -> impl Future<Output = Option<Self::Item>> {
        self.inner.find_map(&mut self.operation)
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        self.inner.size_hint()
    }
}

#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct AsyncFilterMap<I, F> {
    inner: I,
    operation: F,
}

impl<I, F> AsyncFilterMap<I, F> {
    #[inline]
    pub fn new(inner: I, operation: F) -> AsyncFilterMap<I, F> {
        Self { inner, operation }
    }
}

impl<I, F, B, O> AsyncIterator for AsyncFilterMap<I, F>
where
    I: AsyncIterator,
    F: FnMut(I::Item) -> O,
    O: Future<Output = Option<B>>,
{
    type Item = B;

    fn next(&mut self) -> impl Future<Output = Option<Self::Item>> {
        self.inner.afind_map(&mut self.operation)
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        self.inner.size_hint()
    }
}