windows file format device independent bitmap dib / bmp decoding and encoding
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//! “Lifted” from itertools
pub struct UntilDone<'a, I, E: 'a> {
    error: &'a mut Result<(), E>,
    iter: I,
}

impl<'a, I, T, E> Iterator for UntilDone<'a, I, E>
where
    I: Iterator<Item = Result<T, E>>,
{
    type Item = T;

    fn next(&mut self) -> Option<Self::Item> {
        match self.iter.next() {
            Some(Ok(x)) => Some(x),
            Some(Err(e)) => {
                *self.error = Err(e);
                None
            }
            None => None,
        }
    }
}

pub trait Until<T> {
    /// “Lift” a function of the values of an iterator so that it can process
    /// an iterator of `Result` values instead.
    fn until_done<E, R>(self, f: impl FnOnce(UntilDone<Self, E>) -> R) -> Result<R, E>;
}

impl<T, I: Iterator<Item = T>> Until<T> for I {
    fn until_done<E, R>(self, f: impl FnOnce(UntilDone<Self, E>) -> R) -> Result<R, E> {
        let mut error = Ok(());

        let result = f(UntilDone {
            error: &mut error,
            iter: self,
        });

        error.map(|_| result)
    }
}