#[derive(Debug, Clone)]
pub struct MapIter<Iter: Iterator, F> {
iter: Iter,
failed: Vec<Iter::Item>,
f: F,
}
impl<Iter: Iterator, F> MapIter<Iter, F> {
fn new(iter: Iter, f: F) -> Self {
MapIter {
iter,
failed: vec![],
f,
}
}
}
pub trait MapRetry: Iterator + Sized {
fn map_retry<F>(self, f: F) -> MapIter<Self, F>;
}
impl<T: Iterator> MapRetry for T {
fn map_retry<F>(self, f: F) -> MapIter<Self, F> {
MapIter::new(self, f)
}
}
impl<Iter: Iterator, F: FnMut(Iter::Item) -> Result<Out, E>, Out, E> Iterator for MapIter<Iter, F>
where
Iter::Item: Clone,
{
type Item = Result<Out, E>;
fn next(&mut self) -> Option<Self::Item> {
for res in self.iter.by_ref() {
let m = (self.f)(res.clone());
if m.is_ok() {
return Some(m);
} else {
self.failed.push(res);
}
}
Some((self.f)(self.failed.pop()?))
}
}