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}