use crate::prelude::*;
use core::{marker::PhantomData, ops::AsyncFnMut};
pub struct ClosureConsumer<F, Item, Final, Error>
where
F: AsyncFnMut(Either<Item, Final>) -> Result<(), Error>,
{
inner: F,
item: PhantomData<Item>,
fin: PhantomData<Final>,
err: PhantomData<Error>,
}
impl<F, Item, Final, Error> ClosureConsumer<F, Item, Final, Error>
where
F: AsyncFnMut(Either<Item, Final>) -> Result<(), Error>,
{
pub fn new(inner: F) -> Self {
ClosureConsumer {
inner,
item: PhantomData,
fin: PhantomData,
err: PhantomData,
}
}
}
impl<F, Item, Final, Error> From<F> for ClosureConsumer<F, Item, Final, Error>
where
F: AsyncFnMut(Either<Item, Final>) -> Result<(), Error>,
{
fn from(value: F) -> Self {
Self::new(value)
}
}
impl<F, Item, Final, Error> Consumer for ClosureConsumer<F, Item, Final, Error>
where
F: AsyncFnMut(Either<Item, Final>) -> Result<(), Error>,
{
type Item = Item;
type Final = Final;
type Error = Error;
async fn consume(&mut self, val: Either<Self::Item, Self::Final>) -> Result<(), Self::Error> {
(self.inner)(val).await
}
async fn flush(&mut self) -> Result<(), Self::Error> {
Ok(())
}
}