Function itertools::process_results [−][src]
pub fn process_results<I, F, T, E, R>(iterable: I, processor: F) -> Result<R, E> where
I: IntoIterator<Item = Result<T, E>>,
F: FnOnce(ProcessResults<'_, I::IntoIter, E>) -> R,
Expand description
“Lift” a function of the values of an iterator so that it can process
an iterator of Result
values instead.
iterable
is an iterator or iterable with Result<T, E>
elements, where
T
is the value type and E
the error type.
processor
is a closure that receives an adapted version of the iterable
as the only argument — the adapted iterator produces elements of type T
,
as long as the original iterator produces Ok
values.
If the original iterable produces an error at any point, the adapted
iterator ends and the process_results
function will return the
error iself.
Otherwise, the return value from the closure is returned wrapped
inside Ok
.
Example
use itertools::process_results;
type R = Result<i32, &'static str>;
let first_values: Vec<R> = vec![Ok(1), Ok(0), Ok(3)];
let second_values: Vec<R> = vec![Ok(2), Ok(1), Err("overflow")];
// “Lift” the iterator .max() method to work on the values in Results using process_results
let first_max = process_results(first_values, |iter| iter.max().unwrap_or(0));
let second_max = process_results(second_values, |iter| iter.max().unwrap_or(0));
assert_eq!(first_max, Ok(3));
assert!(second_max.is_err());