#![no_std]
use core::iter;
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub trait CollectAllTheErrors<T, E> {
fn partition_results<Oks, Errs>(self) -> (Oks, Errs)
where
Oks: Default + Extend<T>,
Errs: Default + Extend<E>;
fn collected_results<Oks, Errs>(self) -> Result<Oks, Errs>
where
Oks: Default + Extend<T>,
Errs: FromIterator<E>;
fn collect_oks_or_iter_errs<Oks>(self) -> Result<Oks, impl Iterator<Item = E>>
where
Oks: Default + Extend<T>;
}
impl<Iter, T, E> CollectAllTheErrors<T, E> for Iter
where
Iter: Iterator<Item = Result<T, E>>,
{
fn partition_results<Oks, Errs>(self) -> (Oks, Errs)
where
Oks: Default + Extend<T>,
Errs: Default + Extend<E>,
{
let mut oks: Oks = Default::default();
let mut errs: Errs = Default::default();
for item in self {
match item {
Ok(ok) => oks.extend(Some(ok)),
Err(err) => errs.extend(Some(err)),
}
}
(oks, errs)
}
fn collected_results<Oks, Errs>(self) -> Result<Oks, Errs>
where
Oks: Default + Extend<T>,
Errs: FromIterator<E>,
{
self.collect_oks_or_iter_errs()
.map_err(|e| e.collect::<Errs>())
}
fn collect_oks_or_iter_errs<Oks>(mut self) -> Result<Oks, impl Iterator<Item = E>>
where
Oks: Default + Extend<T>,
{
let first_err: E;
let mut successes: Oks = Default::default();
loop {
match self.next() {
None => return Ok(successes),
Some(Ok(succ)) => successes.extend(Some(succ)),
Some(Err(err)) => {
first_err = err;
break;
}
}
}
Err(iter::once(first_err).chain(self.filter_map(Result::err)))
}
}