| // run-pass | |
| trait DigitCollection: Sized { | |
| type Iter: Iterator<Item = u8>; | |
| fn digit_iter(self) -> Self::Iter; | |
| fn digit_sum(self) -> u32 { | |
| self.digit_iter() | |
| .map(|digit: u8| digit as u32) | |
| .fold(0, |sum, digit| sum + digit) | |
| } | |
| } | |
| impl<I> DigitCollection for I where I: Iterator<Item=u8> { | |
| type Iter = I; | |
| fn digit_iter(self) -> I { | |
| self | |
| } | |
| } | |
| fn main() { | |
| let xs = vec![1, 2, 3, 4, 5]; | |
| assert_eq!(xs.into_iter().digit_sum(), 15); | |
| } |