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}