pub trait CollectVecResult: Iterator<Item = Result<Self::T, Self::E>> {
type T;
type E;
fn collect_vec_result(self) -> Result<Vec<Self::T>, Vec<Self::E>>;
}
impl<I, T, E> CollectVecResult for I
where
I: Iterator<Item = Result<T, E>>,
{
type T = T;
type E = E;
fn collect_vec_result(self) -> Result<Vec<Self::T>, Vec<Self::E>> {
let mut oks = vec![];
let mut errs = vec![];
for elem in self {
match elem {
Err(err) => errs.push(err),
Ok(ok) => {
if errs.is_empty() {
oks.push(ok)
}
}
}
}
match errs.as_slice() {
[] => Ok(oks),
[_, ..] => Err(errs),
}
}
}