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