use crate::prelude::*;
pub struct Filter<C, Pred> {
inner: C,
predicate: Pred,
}
impl<C, Pred> Filter<C, Pred>
where
C: Consumer,
Pred: AsyncFnMut(&C::Item) -> bool,
{
pub(crate) fn new(inner: C, predicate: Pred) -> Self {
Filter { inner, predicate }
}
pub fn into_inner(self) -> C {
self.inner
}
}
impl<C, Pred> AsRef<C> for Filter<C, Pred> {
fn as_ref(&self) -> &C {
&self.inner
}
}
impl<C, Pred> Consumer for Filter<C, Pred>
where
C: Consumer,
Pred: AsyncFnMut(&C::Item) -> bool,
{
type Item = C::Item;
type Final = C::Final;
type Error = C::Error;
async fn consume(&mut self, val: Either<Self::Item, Self::Final>) -> Result<(), Self::Error> {
match val {
Left(item) => {
if (self.predicate)(&item).await {
self.inner.consume(Left(item)).await?;
}
}
Right(fin) => self.inner.consume(Right(fin)).await?,
}
Ok(())
}
async fn flush(&mut self) -> Result<(), Self::Error> {
self.inner.flush().await
}
}