use std::collections::BinaryHeap;
use crate::{
prelude::*,
producer::compat::{iterator_to_producer, IteratorToProducer},
};
pub struct IntoProducer<T>(IteratorToProducer<<BinaryHeap<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 BinaryHeap<T> {
type Item = T;
type Final = ();
type Error = Infallible;
type IntoProducer = IntoProducer<T>;
fn into_producer(self) -> Self::IntoProducer {
IntoProducer(iterator_to_producer(
<BinaryHeap<T> as IntoIterator>::into_iter(self),
))
}
}
pub struct IntoProducerRef<'s, T>(
IteratorToProducer<<&'s BinaryHeap<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 BinaryHeap<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()))
}
}