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
impl<T: Sized> IterExt for T where T: Iterator {}

pub trait IterExt: Iterator {
    fn unzip_either<A, B, FromA, FromB>(self) -> (FromA, FromB)
    where
        FromA: Default + Extend<A>,
        FromB: Default + Extend<B>,
        Self: Sized + Iterator<Item = (Option<A>, Option<B>)>,
    {
        let mut a: FromA = Default::default();
        let mut b: FromB = Default::default();

        for next in self {
            match next {
                (Some(e), None) => a.extend(vec![e]),
                (None, Some(e)) => b.extend(vec![e]),
                (Some(e), Some(e1)) => {
                    a.extend(vec![e]);
                    b.extend(vec![e1])
                }
                _ => {}
            }
        }

        (a, b)
    }
}