Skip to content
Permalink
Browse files

Expand `impl FromIterator for Result` doc to include examples of `Err…

…` and early termination.
  • Loading branch information...
pnkfelix committed Mar 20, 2019
1 parent 48af718 commit d5a61c0be25d47c39ab7909b83b3a2765a282eb1
Showing with 28 additions and 0 deletions.
  1. +28 −0 src/libcore/result.rs
@@ -1202,6 +1202,34 @@ impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
/// ).collect();
/// assert_eq!(res, Ok(vec![2, 3]));
/// ```
///
/// Here is another example that tries to subtract one from another list
/// of integers, this time checking for underflow:
///
/// ```
/// let v = vec![1, 2, 0];
/// let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|
/// x.checked_sub(1).ok_or("Underflow!")
/// ).collect();
/// assert_eq!(res, Err("Underflow!"));
/// ```
///
/// Here is a variation on the previous example, showing that no
/// further elements are taken from `iter` after the first `Err`.
///
/// ```
/// let v = vec![3, 2, 1, 10];
/// let mut shared = 0;
/// let res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|
/// shared += x;
/// x.checked_sub(2).ok_or("Underflow!")
/// ).collect();
/// assert_eq!(res, Err("Underflow!"));
/// assert_eq!(shared, 6);
/// ```
///
/// Since the third element caused an underflow, no further elements were taken,
/// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16.
#[inline]
fn from_iter<I: IntoIterator<Item=Result<A, E>>>(iter: I) -> Result<V, E> {
// FIXME(#11084): This could be replaced with Iterator::scan when this

0 comments on commit d5a61c0

Please sign in to comment.
You can’t perform that action at this time.