about summary refs log tree commit diff
path: root/src/libcoretest
diff options
context:
space:
mode:
authorJake Goulding <jake.goulding@gmail.com>2016-12-23 14:30:37 -0500
committerJake Goulding <jake.goulding@gmail.com>2017-01-10 14:24:06 -0500
commit23715d344de0377624be95b48830582594aed7ff (patch)
tree10183eb1541579d01e77a229c9ed564e036b9fb9 /src/libcoretest
parent7bffede97cf58f7159e261eac592f9cf88ce209d (diff)
Implement `iter::Sum` and `iter::Product` for `Result`
This introduces a private iterator adapter `ResultShunt`, which allows
treating an iterator of `Result<T, E>` as an iterator of `T`.
Diffstat (limited to 'src/libcoretest')
-rw-r--r--src/libcoretest/iter.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/libcoretest/iter.rs b/src/libcoretest/iter.rs
index 274539dfa66..99d31293053 100644
--- a/src/libcoretest/iter.rs
+++ b/src/libcoretest/iter.rs
@@ -615,6 +615,14 @@ fn test_iterator_sum() {
 }
 
 #[test]
+fn test_iterator_sum_result() {
+    let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)];
+    assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Ok(10));
+    let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)];
+    assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Err(()));
+}
+
+#[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::<i32>(), 0);
@@ -623,6 +631,14 @@ fn test_iterator_product() {
 }
 
 #[test]
+fn test_iterator_product_result() {
+    let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)];
+    assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Ok(24));
+    let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)];
+    assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Err(()));
+}
+
+#[test]
 fn test_iterator_max() {
     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
     assert_eq!(v[..4].iter().cloned().max(), Some(3));