fmtastic 0.2.2

Format numbers using the unicode characters via the Display trait.
Documentation
use crate::integer::{Base, IntegerImpl};

/// Iterates the digits of the given integer. Zero has one digit.
pub(crate) fn iter_digits<T: IntegerImpl, B: Base<T>>(n: T) -> impl Iterator<Item = usize> {
    let n = n.abs();
    B::powers(n).scan(n, move |remainder, power| {
        let digit = *remainder / power;
        *remainder = n % power;
        Some(digit.as_usize())
    })
}

#[cfg(test)]
mod test {
    use super::*;
    use crate::integer::IntegerImpl;

    #[test]
    fn zero_has_zero_as_digits() {
        let digits: Vec<_> = iter_digits::<_, <u32 as IntegerImpl>::BaseTen>(0_u32).collect();
        assert_eq!(vec![0], digits);
    }

    #[test]
    fn iterates_digits_in_base_10() {
        let digits: Vec<_> =
            iter_digits::<_, <u32 as IntegerImpl>::BaseTen>(1234567890_u32).collect();
        assert_eq!(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 0], digits);
    }

    #[test]
    fn iterates_digits_in_base_2() {
        let digits: Vec<_> = iter_digits::<_, <u32 as IntegerImpl>::BaseTwo>(0b10110110).collect();
        assert_eq!(vec![1, 0, 1, 1, 0, 1, 1, 0], digits);
    }

    #[test]
    fn iterates_digits_of_negative_number() {
        let digits: Vec<_> = iter_digits::<_, <u32 as IntegerImpl>::BaseTen>(-1234).collect();
        assert_eq!(vec![1, 2, 3, 4], digits);
    }
}