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
use crate::{Op, Relation};

impl<C: Op<D = (L, R)>, L, R> Relation<C> {
    /// Splits a collection of 2-tuples into a 2-tuple of collections.
    ///
    /// Example:
    ///
    /// ```
    ///    use standing_relations::CreationContext;
    ///    use std::{collections::HashMap, iter::FromIterator};
    ///
    ///    let mut context = CreationContext::new();
    ///    let (mut foo_input, foo) = context.new_input::<usize>();
    ///    let (evens, odds) = foo.map(|x| (x * 2, x * 2 + 1)).split();
    ///    let evens = evens.into_output(&context);
    ///    let odds = odds.into_output(&context);
    ///    
    ///    let mut context = context.begin();
    ///    foo_input.add_all(&context, 0 .. 2);
    ///    context.commit();
    ///    assert_eq!(&*evens.get(&context), &HashMap::from_iter(vec![(0,1),(2,1)]));
    ///    assert_eq!(&*odds.get(&context), &HashMap::from_iter(vec![(1,1),(3,1)]));
    /// ```
    pub fn split(self) -> (Relation<impl Op<D = L>>, Relation<impl Op<D = R>>) {
        self.map_(|((lx, rx), count)| ((lx, count), (rx, count)))
            .hidden()
            .split_()
    }
}