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