-   Notifications  
You must be signed in to change notification settings  - Fork 337
 
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