resiter/while_ok.rs
1//
2// This Source Code Form is subject to the terms of the Mozilla Public
3// License, v. 2.0. If a copy of the MPL was not distributed with this
4// file, You can obtain one at http://mozilla.org/MPL/2.0/.
5//
6
7/// Extension trait for `Iterator<Item = Result<O, E>>` to iter until an error is encountered.
8pub trait WhileOk<O, E> {
9 /// Perform an on each `Ok` value. Stop on first `Err`
10 ///
11 /// ```
12 /// use resiter::while_ok::WhileOk;
13 /// use std::str::FromStr;
14 ///
15 /// let mut s = 0;
16 ///
17 /// let res = ["1", "2", "3", "4", "5"]
18 /// .iter()
19 /// .map(|txt| usize::from_str(txt))
20 /// .while_ok(|i| s += i);
21 ///
22 /// assert_eq!(s, 15);
23 /// assert!(res.is_ok());
24 /// ```
25 /// When every value is `Ok` stop the iteration at the end of the iterator:
26 /// ```
27 /// use resiter::while_ok::WhileOk;
28 /// use std::str::FromStr;
29 ///
30 /// let mut s = 0;
31 ///
32 /// let res = ["1", "2", "a", "4", "5"]
33 /// .iter()
34 /// .map(|txt| usize::from_str(txt))
35 /// .while_ok(|i| s += i);
36 ///
37 /// assert_eq!(s, 3);
38 /// assert!(res.is_err());
39 /// ```
40 fn while_ok<F>(self, _: F) -> Result<(), E>
41 where
42 F: FnMut(O);
43}
44
45impl<I, O, E> WhileOk<O, E> for I
46where
47 I: Iterator<Item = Result<O, E>>,
48{
49 #[inline]
50 fn while_ok<F>(self, mut f: F) -> Result<(), E>
51 where
52 F: FnMut(O),
53 {
54 for res in self {
55 f(res?);
56 }
57 Ok(())
58 }
59}