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()
}
}