pub trait IteratorExt: Iterator {
fn map_ok<T, U, E, F>(self, f: F) -> MapOk<Self, F>
where
Self: Sized + Iterator<Item = Result<T, E>>,
F: FnMut(T) -> U,
{
MapOk { iter: self, f }
}
}
#[derive(Debug)]
pub struct MapOk<I, F> {
iter: I,
f: F,
}
impl<I, T, U, E, F> Iterator for MapOk<I, F>
where
I: Iterator<Item = Result<T, E>>,
F: FnMut(T) -> U,
{
type Item = Result<U, E>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|res| res.map(&mut self.f))
}
}
impl<I> IteratorExt for I where I: Iterator {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_map_ok() {
let mut iter = [Ok(1u8), Err(0u8), Ok(2)].into_iter().map_ok(|n| n + 1);
assert_eq!(iter.next(), Some(Ok(2)));
assert_eq!(iter.next(), Some(Err(0)));
assert_eq!(iter.next(), Some(Ok(3)));
assert_eq!(iter.next(), None);
}
}