yui_core/traits/
digits.rs

1pub trait IntoDigits: Sized { 
2    type Digit;
3    fn into_digits(self) -> Vec<Self::Digit> { 
4        self.into_rev_digits().into_iter().rev().collect()
5    }
6
7    fn into_rev_digits(self) -> Vec<Self::Digit> { 
8        self.into_digits().into_iter().rev().collect()
9    }
10}
11
12macro_rules! impl_into_digits {
13    ($t: ty, $d: ty) => {
14        impl IntoDigits for $t { 
15            type Digit = $d;
16            fn into_rev_digits(self) -> Vec<$d> {
17                if self == 0 { return vec![0] }
18        
19                let mut num = self;
20                (0..).map_while(|_| { 
21                    if num > 0 { 
22                        let d = (num % 10) as $d;
23                        num /= 10;
24                        Some(d)
25                    } else {
26                        None
27                    }
28                }).collect()
29            }
30        }                
31    };
32}
33
34impl_into_digits!(usize, u8);
35
36#[cfg(test)]
37mod tests { 
38    use super::*;
39
40    #[test]
41    fn usize() { 
42        let a = 123456789;
43        assert_eq!(a.into_digits(), vec![1,2,3,4,5,6,7,8,9]);
44        assert_eq!(a.into_rev_digits(), vec![9,8,7,6,5,4,3,2,1]);
45    }
46}