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());