catfx 0.1.0

Apply effects to a text stream
Documentation
//! Iterator utilities.
/// Extends iterator functionality.
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 }
    }
}

/// Iterator that maps the values of `Ok` results.
#[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);
    }
}