1use core::marker::PhantomData;
2
3use crate::FromLeStream;
4
5pub trait LeStream: Sized {
7 fn le_stream<T>(self) -> LeStreamIterator<T, Self>;
9}
10
11impl<I> LeStream for I
12where
13 I: Iterator<Item = u8>,
14{
15 fn le_stream<T>(self) -> LeStreamIterator<T, Self> {
16 LeStreamIterator {
17 iterator: self,
18 _type: PhantomData,
19 }
20 }
21}
22
23#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
25pub struct LeStreamIterator<T, I> {
26 iterator: I,
27 _type: PhantomData<T>,
28}
29
30impl<T, I> LeStreamIterator<T, I> {
31 #[must_use]
33 pub fn into_inner(self) -> I {
34 self.iterator
35 }
36}
37
38impl<T, I> Iterator for LeStreamIterator<T, I>
39where
40 T: FromLeStream,
41 I: Iterator<Item = u8>,
42{
43 type Item = T;
44
45 fn next(&mut self) -> Option<Self::Item> {
46 T::from_le_stream(&mut self.iterator)
47 }
48}