use std::result::Result as RResult;
pub trait ResultIterExt<I, E> : Sized {
fn collect_result<T>(self) -> RResult<T, E>
where T: Extend<I> + Default
{
let mut res = T::default();
self.collect_result_into(&mut res)?;
Ok(res)
}
fn collect_result_into<T>(self, target: &mut T) -> RResult<(), E>
where T: Extend<I>;
}
impl<I, E, J> ResultIterExt<I, E> for J
where J: Iterator<Item = RResult<I, E>>
{
fn collect_result_into<T>(self, target: &mut T) -> RResult<(), E>
where T: Extend<I>
{
for item in self {
target.extend(Some(item?));
}
Ok(())
}
}