use core::iter::*; use std::num::Saturating; #[test] fn test_iterator_sum() { let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; assert_eq!(v[..4].iter().cloned().sum::(), 6); assert_eq!(v.iter().cloned().sum::(), 55); assert_eq!(v[..0].iter().cloned().sum::(), 0); } #[test] fn test_iterator_sum_result() { let v: &[Result] = &[Ok(1), Ok(2), Ok(3), Ok(4)]; assert_eq!(v.iter().cloned().sum::>(), Ok(10)); let v: &[Result] = &[Ok(1), Err(()), Ok(3), Ok(4)]; assert_eq!(v.iter().cloned().sum::>(), Err(())); #[derive(PartialEq, Debug)] struct S(Result); impl Sum> for S { fn sum>>(mut iter: I) -> Self { // takes the sum by repeatedly calling `next` on `iter`, // thus testing that repeated calls to `ResultShunt::try_fold` // produce the expected results Self(iter.by_ref().sum()) } } let v: &[Result] = &[Ok(1), Ok(2), Ok(3), Ok(4)]; assert_eq!(v.iter().cloned().sum::(), S(Ok(10))); let v: &[Result] = &[Ok(1), Err(()), Ok(3), Ok(4)]; assert_eq!(v.iter().cloned().sum::(), S(Err(()))); } #[test] fn test_iterator_sum_option() { let v: &[Option] = &[Some(1), Some(2), Some(3), Some(4)]; assert_eq!(v.iter().cloned().sum::>(), Some(10)); let v: &[Option] = &[Some(1), None, Some(3), Some(4)]; assert_eq!(v.iter().cloned().sum::>(), None); } #[test] fn test_iterator_product() { let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; assert_eq!(v[..4].iter().cloned().product::(), 0); assert_eq!(v[1..5].iter().cloned().product::(), 24); assert_eq!(v[..0].iter().cloned().product::(), 1); } #[test] fn test_iterator_product_result() { let v: &[Result] = &[Ok(1), Ok(2), Ok(3), Ok(4)]; assert_eq!(v.iter().cloned().product::>(), Ok(24)); let v: &[Result] = &[Ok(1), Err(()), Ok(3), Ok(4)]; assert_eq!(v.iter().cloned().product::>(), Err(())); } #[test] fn test_iterator_product_option() { let v: &[Option] = &[Some(1), Some(2), Some(3), Some(4)]; assert_eq!(v.iter().cloned().product::>(), Some(24)); let v: &[Option] = &[Some(1), None, Some(3), Some(4)]; assert_eq!(v.iter().cloned().product::>(), None); } #[test] fn test_saturating_sum_product() { let v = (1u32..=10).map(|i| Saturating(i)); assert_eq!(v.sum::>(), Saturating(55)); let v = (1u32..=10).map(|i| Saturating(i)); assert_eq!(v.product::>(), Saturating(3628800)); let v = [Saturating(usize::MAX), Saturating(2)]; assert_eq!(v.iter().copied().sum::>(), Saturating(usize::MAX)); assert_eq!(v.iter().copied().product::>(), Saturating(usize::MAX)); let mut cnt = 0; let v = 250..=u8::MAX; assert_eq!( v.map(|i| { cnt += 1; Saturating(i) }) .sum::>(), Saturating(u8::MAX) ); assert_eq!(cnt, 6); // no short-circuiting let mut cnt = 0; let v = (250..=u8::MAX).chain(0..5); assert_eq!( v.map(|i| { cnt += 1; Saturating(i) }) .product::>(), Saturating(0) ); assert_eq!(cnt, 11); // no short-circuiting }