1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/// If at least one `Result` is an error, turn all of them into errors. Else, unwrap the `Result`s.
///
/// See [fail_all_vec] for an easier-to-understand version specialized for `Vec`.
///
/// [fail_all] is its lower-level implementation. You probably want to create
/// a similar wrapper function instead of using [fail_all] directly.
///
/// ## Examples
///
/// ```rust
/// # use multiple_errors::fail_all;
/// # use multiple_errors::testing_prelude::*;
/// #
/// // Manually:
///
/// let Ok(ok) = fail_all([Ok(A), Ok(A)], |_: Result<_, ErrA>| ErrC) else {
/// panic!();
/// };
/// assert_eq!(ok.collect::<Vec<_>>(), vec![A, A]);
///
/// // Or using a helper function for your container:
///
/// pub fn fail_all_3<T, E1, E2, F>(results: [Result<T, E1>; 3], f: F) -> Result<[T; 3], [E2; 3]>
/// where
/// F: FnMut(Result<T, E1>) -> E2,
/// {
/// fn collect_3<T>(mut iter: impl Iterator<Item = T>) -> [T; 3] {
/// core::array::from_fn(|_| iter.next().expect("the iterator should have 3 elements"))
/// }
/// fail_all(results, f).map(collect_3).map_err(collect_3)
/// }
///
/// let err = fail_all_3(
/// [Ok(A), Err(ErrA), Ok(A)],
/// |res| res.err().map(HighLevelErr::from).unwrap_or(HighLevelErr::B(ErrB))
/// );
/// // Each element turned into an error.
/// assert_eq!(err, Err([ErrB.into(), ErrA.into(), ErrB.into()]));
/// ```
/// If at least one `Result` is an error, turn all of them into errors. Else, unwrap the `Result`s.
///
/// See [fail_all] for a more generic/low-level version that works with other
/// input containers and doesn't `collect()`.
///
/// ## Examples
///
/// ```rust
/// # use multiple_errors::fail_all_vec;
/// # use multiple_errors::testing_prelude::*;
/// #
/// let err = fail_all_vec(
/// vec![Ok(A), Err(ErrA), Ok(A)],
/// |res| res.err().map(HighLevelErr::from).unwrap_or(HighLevelErr::B(ErrB))
/// );
/// // Same length as the original, each element turned into an error.
/// assert_eq!(err, Err(vec![ErrB.into(), ErrA.into(), ErrB.into()]));
/// #
/// # let ok = fail_all_vec(vec![Ok(A), Ok(A)], |_: Result<_, ErrA>| ErrC);
/// # assert_eq!(ok, Ok(vec![A, A]));
/// ```