use core::convert::Infallible;
use crate::prelude::*;
#[derive(Debug, Clone)]
pub struct IteratorToProducer<I>(I);
pub fn iterator_to_producer<T>(iter: T) -> IteratorToProducer<T> {
IteratorToProducer(iter)
}
impl<I> IteratorToProducer<I> {
pub fn into_inner(self) -> I {
self.0
}
}
impl<I> AsRef<I> for IteratorToProducer<I> {
fn as_ref(&self) -> &I {
&self.0
}
}
impl<I> AsMut<I> for IteratorToProducer<I> {
fn as_mut(&mut self) -> &mut I {
&mut self.0
}
}
impl<I> Producer for IteratorToProducer<I>
where
I: Iterator,
{
type Item = I::Item;
type Final = ();
type Error = Infallible;
async fn produce(&mut self) -> Result<Either<Self::Item, Self::Final>, Self::Error> {
match self.0.next() {
Some(it) => Ok(Left(it)),
None => Ok(Right(())),
}
}
async fn slurp(&mut self) -> Result<(), Self::Error> {
Ok(())
}
}