standing_relations/convenience/
split.rs

1use crate::{Op, Relation};
2
3impl<C: Op<D = (L, R)>, L, R> Relation<C> {
4    /// Splits a collection of 2-tuples into a 2-tuple of collections.
5    ///
6    /// Example:
7    ///
8    /// ```
9    ///    use standing_relations::CreationContext;
10    ///    use std::{collections::HashMap, iter::FromIterator};
11    ///
12    ///    let mut context = CreationContext::new();
13    ///    let (mut foo_input, foo) = context.new_input::<usize>();
14    ///    let (evens, odds) = foo.map(|x| (x * 2, x * 2 + 1)).split();
15    ///    let evens = evens.into_output(&context);
16    ///    let odds = odds.into_output(&context);
17    ///    
18    ///    let mut context = context.begin();
19    ///    foo_input.add_all(&context, 0 .. 2);
20    ///    context.commit();
21    ///    assert_eq!(&*evens.get(&context), &HashMap::from_iter(vec![(0,1),(2,1)]));
22    ///    assert_eq!(&*odds.get(&context), &HashMap::from_iter(vec![(1,1),(3,1)]));
23    /// ```
24    pub fn split(self) -> (Relation<impl Op<D = L>>, Relation<impl Op<D = R>>) {
25        self.map_(|((lx, rx), count)| ((lx, count), (rx, count)))
26            .hidden()
27            .split_()
28    }
29}