Closed
Description
- Input iterator item:
Result<T, E>
- Collected output:
Result<Option<T>, E>
This "collector" should return the first Ok
value it finds as Ok(Some(value))
.
If no Ok
values are found, return the last Err
.
If no values are in the iterator, return Ok(None)
I've written this a couple of times in my own code and figured it'd be useful for Itertools to include.
fn find_first_ok<T, E, I>(iter: I) -> Result<Option<T>, E>
where
I: IntoIterator<Item = Result<T, E>>,
{
let mut last_err = None;
for item in iter {
match item {
Ok(value) => return Ok(Some(value)),
Err(err) => last_err = Some(err),
}
}
match last_err {
Some(err) => Err(err),
None => Ok(None),
}
}
#[test]
fn test_no_items() {
assert_eq!(find_first_ok::<(), (), _>([]), Ok(None));
}
#[test]
fn test_only_err() {
assert_eq!(find_first_ok::<(), u8, _>([
Err(1),
Err(2),
Err(3),
]), Err(3));
}
#[test]
fn test_ok() {
assert_eq!(find_first_ok::<(), u8, _>([
Err(1),
Ok(()),
Err(2),
]), Ok(Some(())));
}
Metadata
Metadata
Assignees
Labels
No labels