result_iter 0.1.0

Easily unwrap iterators over results
Documentation
extern crate result_iter;
use result_iter::{ResultIterExt, MultiError};

use std::io;

#[test]
fn smoke() {
    let err = || Err(io::Error::from(io::ErrorKind::Other));
    let errs = || vec![Ok(()), err(), err(), Ok(())];
    let nerrs = || vec![Ok(()), Ok(()), Ok(()), Ok(())];

    let r: Vec<Result<(), io::Error>>
        = errs().into_iter()
        .end_if_err().collect::<Vec<_>>();

    assert!(r.len() == 2);

    let r: Vec<Result<(), io::Error>>
        = nerrs().into_iter()
        .end_if_err().collect::<Vec<_>>();

    assert!(r.len() == 4);

    let r = || -> Result<(), MultiError<io::Error>> {
        let r: Vec<()>
            = nerrs().into_iter()
            .fail_slow_if_err()?.collect::<Vec<_>>();
        assert!(r.len() == 4);

        let _ = errs().into_iter().fail_slow_if_err()?;
        unreachable!();
    }();

    let e = r.unwrap_err();
    assert!(e.len() == 2);
    let mut e = e.into_iter();
    assert!(e.next().is_some());

    let r = || -> Result<(), io::Error> {
        let r: Vec<()>
            = nerrs().into_iter()
            .fail_fast_if_err()?.collect::<Vec<_>>();
        assert!(r.len() == 4);

        let _ = errs().into_iter().fail_fast_if_err()?;
        unreachable!();
    }();

    assert!(r.is_err());
}