tick_encoding/
iter.rs

1use crate::{
2    decoder::{DecodeStatus, Decoder},
3    encoder::Encoder,
4    DecodeError,
5};
6
7/// The iterator returned by [`crate::encode_iter`].
8#[derive(Debug, Clone, Copy)]
9pub struct EncodeIter<I> {
10    iter: I,
11    encoder: Encoder,
12}
13
14impl<I> EncodeIter<I> {
15    pub(crate) fn new(iter: I) -> Self {
16        Self {
17            iter,
18            encoder: Encoder::default(),
19        }
20    }
21
22    /// Get a reference to the inner iterator.
23    pub fn inner(&self) -> &I {
24        &self.iter
25    }
26
27    /// Get a mutable reference to the inner iterator.
28    pub fn inner_mut(&mut self) -> &mut I {
29        &mut self.iter
30    }
31
32    /// Take the inner iterator.
33    pub fn into_inner(self) -> I {
34        self.iter
35    }
36}
37
38impl<I> Iterator for EncodeIter<I>
39where
40    I: Iterator<Item = u8>,
41{
42    type Item = char;
43
44    fn next(&mut self) -> Option<Self::Item> {
45        if let Some(encoded) = self.encoder.next() {
46            return Some(encoded);
47        }
48
49        let byte = self.iter.next()?;
50        let encoded = self.encoder.push(byte);
51        Some(encoded)
52    }
53}
54
55/// The iterator returned by [`crate::decode_iter`].
56#[derive(Debug, Clone, Copy)]
57pub struct DecodeIter<I> {
58    iter: I,
59    decoder: Decoder,
60}
61
62impl<I> DecodeIter<I> {
63    pub(crate) fn new(iter: I) -> Self {
64        Self {
65            iter,
66            decoder: Decoder::default(),
67        }
68    }
69
70    /// Get a reference to the inner iterator.
71    pub fn inner(&self) -> &I {
72        &self.iter
73    }
74
75    /// Get a mutable reference to the inner iterator.
76    pub fn inner_mut(&mut self) -> &mut I {
77        &mut self.iter
78    }
79
80    /// Take the inner iterator.
81    pub fn into_inner(self) -> I {
82        self.iter
83    }
84}
85
86impl<I> Iterator for DecodeIter<I>
87where
88    I: Iterator<Item = u8>,
89{
90    type Item = Result<u8, DecodeError>;
91
92    fn next(&mut self) -> Option<Self::Item> {
93        loop {
94            let next_byte = self.iter.next();
95            match self.decoder.push(next_byte) {
96                DecodeStatus::NeedMore => {}
97                DecodeStatus::Emit(result) => {
98                    return result;
99                }
100            }
101        }
102    }
103}