digit_sequence/
iteration.rs

1use crate::DigitSequence;
2
3impl DigitSequence {
4    /// Repeatable iteration over references to the digits.
5    ///
6    /// ```
7    /// use digit_sequence::*;
8    ///
9    /// # fn main() -> GenericResult<()> {
10    /// let source = [9, 5, 0, 2];
11    /// let sequence: DigitSequence = (&source).try_into()?;
12    /// let mut target: Vec<u8> = vec![];
13    ///
14    /// for &digit in sequence.iter() {
15    ///     target.push(digit)
16    /// }
17    ///
18    /// for &digit in sequence.iter() {
19    ///     target.push(digit)
20    /// }
21    ///
22    /// let expected_vec: Vec<u8> = [&source[..], &source[..]].concat();
23    ///
24    /// assert_eq!(target, expected_vec);
25    ///
26    /// # Ok(())
27    /// # }
28    /// ```
29    pub fn iter(&self) -> std::slice::Iter<u8> {
30        self.0.iter()
31    }
32}
33
34/// Consuming iteration on [DigitSequence] is supported:
35///
36/// ```
37/// use digit_sequence::*;
38///
39/// # fn main() -> GenericResult<()> {
40/// let source = [9, 5, 0, 2];
41/// let sequence: DigitSequence = (&source).try_into()?;
42/// let mut target: Vec<u8> = vec![];
43///
44/// for digit in sequence {
45///     target.push(digit)
46/// }
47///
48/// assert_eq!(target, source);
49///
50/// # Ok(())
51/// # }
52/// ```
53///
54/// In this case, the sequence cannot be reused once consumed:
55///
56/// ```compile_fail
57/// use digit_sequence::*;
58///
59/// # fn main() -> GenericResult<()> {
60/// let source = [9, 5, 0, 2];
61/// let sequence: DigitSequence = (&source).try_into()?;
62///
63/// for digit in sequence {
64///     //Just do something
65/// }
66///
67/// for digit in sequence {
68///     //Could never arrive here
69/// }
70///
71/// # Ok(())
72/// # }
73/// ```
74impl IntoIterator for DigitSequence {
75    type Item = u8;
76
77    type IntoIter = std::vec::IntoIter<Self::Item>;
78
79    fn into_iter(self) -> Self::IntoIter {
80        self.0.into_iter()
81    }
82}
83
84/// Repeatable, reference-based iteration on &[DigitSequence] is supported.
85///
86/// ```
87/// use digit_sequence::*;
88///
89/// # fn main() -> GenericResult<()> {
90/// let source = [9, 5, 0, 2];
91/// let sequence: DigitSequence = (&source).try_into()?;
92/// let mut target: Vec<u8> = vec![];
93///
94/// for digit in &sequence {
95///     target.push(*digit)
96/// }
97///
98/// for digit in &sequence {
99///     target.push(*digit)
100/// }
101///
102/// let expected_vec: Vec<u8> = [&source[..], &source[..]].concat();
103///
104/// assert_eq!(target, expected_vec);
105///
106/// # Ok(())
107/// # }
108/// ```
109impl<'a> IntoIterator for &'a DigitSequence {
110    type Item = &'a u8;
111
112    type IntoIter = std::slice::Iter<'a, u8>;
113
114    fn into_iter(self) -> Self::IntoIter {
115        self.0.iter()
116    }
117}