yui_core/traits/
digits.rs1pub 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}