diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-08-06 15:36:27 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-08-06 15:36:27 +0200 |
| commit | c32735d03c5dffe4acf79f500bb2f248469a4e66 (patch) | |
| tree | 8a7c0a9c1062e6b324daa5bf4656add88c2375ff /src/libcore/tests | |
| parent | 8996328ebf34aa73e83a1db326767c11041f811d (diff) | |
| parent | 2e41ba8742c341eaf1ec1b5954e089e4d2c02dd0 (diff) | |
| download | rust-c32735d03c5dffe4acf79f500bb2f248469a4e66.tar.gz rust-c32735d03c5dffe4acf79f500bb2f248469a4e66.zip | |
Rollup merge of #62459 - timvermeulen:result_sum_internal_iteration, r=scottmcm
Use internal iteration in the Sum and Product impls of Result and Option This PR adds internal iteration to the `ResultShunt` iterator type underlying the `Sum` and `Product` impls of `Result`. I had to change `ResultShunt` to hold a mutable reference to an error instead, similar to `itertools::ProcessResults`, in order to be able to pass the `ResultShunt` itself by value (which is necessary for internal iteration). `ResultShunt::process` can unfortunately no longer be an associated function because that would make it generic over the lifetime of the error reference, which wouldn't work, so I turned it into the free function `process_results`. I removed the `OptionShunt` type and forwarded the `Sum` and `Product` impls of `Option` to their respective impls of `Result` instead, to avoid having to repeat the internal iteration logic.
Diffstat (limited to 'src/libcore/tests')
| -rw-r--r-- | src/libcore/tests/iter.rs | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/libcore/tests/iter.rs b/src/libcore/tests/iter.rs index e27e1605607..3615fab7915 100644 --- a/src/libcore/tests/iter.rs +++ b/src/libcore/tests/iter.rs @@ -1203,6 +1203,23 @@ fn test_iterator_sum_result() { 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(())); + + #[derive(PartialEq, Debug)] + struct S(Result<i32, ()>); + + impl Sum<Result<i32, ()>> for S { + fn sum<I: Iterator<Item = Result<i32, ()>>>(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<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)]; + assert_eq!(v.iter().cloned().sum::<S>(), S(Ok(10))); + let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)]; + assert_eq!(v.iter().cloned().sum::<S>(), S(Err(()))); } #[test] |
