use core::marker::PhantomData;
use crate::FromLeStream;
pub trait LeStream: Sized {
fn le_stream<T>(self) -> LeStreamIterator<T, Self>;
}
impl<I> LeStream for I
where
I: Iterator<Item = u8>,
{
fn le_stream<T>(self) -> LeStreamIterator<T, Self> {
LeStreamIterator {
iterator: self,
_type: PhantomData,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct LeStreamIterator<T, I> {
iterator: I,
_type: PhantomData<T>,
}
impl<T, I> LeStreamIterator<T, I> {
#[must_use]
pub fn into_inner(self) -> I {
self.iterator
}
}
impl<T, I> Iterator for LeStreamIterator<T, I>
where
T: FromLeStream,
I: Iterator<Item = u8>,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
T::from_le_stream(&mut self.iterator)
}
}