use std::collections::LinkedList;
use crate::{
prelude::*,
producer::compat::{iterator_to_producer, IteratorToProducer},
};
pub struct IntoProducer<T>(IteratorToProducer<<LinkedList<T> as IntoIterator>::IntoIter>);
impl<T> Producer for IntoProducer<T> {
type Item = T;
type Final = ();
type Error = Infallible;
async fn produce(&mut self) -> Result<Either<Self::Item, Self::Final>, Self::Error> {
self.0.produce().await
}
async fn slurp(&mut self) -> Result<(), Self::Error> {
Ok(())
}
}
impl<T> crate::IntoProducer for LinkedList<T> {
type Item = T;
type Final = ();
type Error = Infallible;
type IntoProducer = IntoProducer<T>;
fn into_producer(self) -> Self::IntoProducer {
IntoProducer(iterator_to_producer(
<LinkedList<T> as IntoIterator>::into_iter(self),
))
}
}
pub struct IntoProducerRef<'s, T>(
IteratorToProducer<<&'s LinkedList<T> as IntoIterator>::IntoIter>,
);
impl<'s, T> Producer for IntoProducerRef<'s, T> {
type Item = &'s T;
type Final = ();
type Error = Infallible;
async fn produce(&mut self) -> Result<Either<Self::Item, Self::Final>, Self::Error> {
self.0.produce().await
}
async fn slurp(&mut self) -> Result<(), Self::Error> {
Ok(())
}
}
impl<'s, T> crate::IntoProducer for &'s LinkedList<T> {
type Item = &'s T;
type Final = ();
type Error = Infallible;
type IntoProducer = IntoProducerRef<'s, T>;
fn into_producer(self) -> Self::IntoProducer {
IntoProducerRef(iterator_to_producer(self.iter()))
}
}
pub struct IntoProducerMut<'s, T>(
IteratorToProducer<<&'s mut LinkedList<T> as IntoIterator>::IntoIter>,
);
impl<'s, T> Producer for IntoProducerMut<'s, T> {
type Item = &'s mut T;
type Final = ();
type Error = Infallible;
async fn produce(&mut self) -> Result<Either<Self::Item, Self::Final>, Self::Error> {
self.0.produce().await
}
async fn slurp(&mut self) -> Result<(), Self::Error> {
Ok(())
}
}
impl<'s, T> crate::IntoProducer for &'s mut LinkedList<T> {
type Item = &'s mut T;
type Final = ();
type Error = Infallible;
type IntoProducer = IntoProducerMut<'s, T>;
fn into_producer(self) -> Self::IntoProducer {
IntoProducerMut(iterator_to_producer(self.iter_mut()))
}
}