Skip to main content

le_stream/
stream.rs

1use core::marker::PhantomData;
2
3use crate::FromLeStream;
4
5/// Extension trait on iterators to convert them into streams of deserializable types.
6pub trait LeStream: Sized {
7    /// Convert an iterator of little endian bytes into a stream of deserializable types.
8    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/// An iterator over a little endian byte stream.
24#[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    /// Consumes the iterator, returning the underlying byte stream.
32    #[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}