conspire/math/set/sets/
mod.rs

1pub struct Sets<R, S, T, U, V>
2where
3    R: IntoIterator<Item = S>,
4    S: IntoIterator<Item = T>,
5    U: IntoIterator<Item = V>,
6{
7    members: R,
8    sets: U,
9}
10
11impl<S, T> From<Vec<S>> for Sets<Vec<S>, S, T, Vec<usize>, usize>
12where
13    S: IntoIterator<Item = T>,
14{
15    fn from(data: Vec<S>) -> Self {
16        let sets = (0..data.len()).collect();
17        (sets, data).into()
18    }
19}
20
21impl<S, T, V> From<(Vec<V>, Vec<S>)> for Sets<Vec<S>, S, T, Vec<V>, V>
22where
23    S: IntoIterator<Item = T>,
24{
25    fn from((sets, members): (Vec<V>, Vec<S>)) -> Self {
26        assert_eq!(members.len(), sets.len());
27        Self { members, sets }
28    }
29}
30
31impl<S, T> From<Sets<Vec<S>, S, T, Vec<usize>, usize>> for (Vec<usize>, Vec<S>)
32where
33    S: IntoIterator<Item = T>,
34{
35    fn from(sets: Sets<Vec<S>, S, T, Vec<usize>, usize>) -> Self {
36        (sets.sets, sets.members)
37    }
38}
39
40impl<R, S, T, U, V> Sets<R, S, T, U, V>
41where
42    R: IntoIterator<Item = S>,
43    S: IntoIterator<Item = T>,
44    U: IntoIterator<Item = V>,
45    for<'a> &'a R: IntoIterator<Item = &'a S>,
46    for<'a> &'a S: IntoIterator<Item = &'a T>,
47    T: Copy + Ord,
48{
49    pub fn members(&self) -> &R {
50        &self.members
51    }
52    fn unique_members(&self) -> Vec<T> {
53        let mut unique_members: Vec<T> = (&self.members)
54            .into_iter()
55            .flat_map(|members| members.into_iter().copied())
56            .collect();
57        unique_members.sort_unstable();
58        unique_members.dedup();
59        unique_members
60    }
61}
62
63pub trait InverseSets<R, S, T, U, V, W>
64where
65    R: IntoIterator<Item = S>,
66    S: IntoIterator<Item = T>,
67    U: IntoIterator<Item = V>,
68{
69    fn inverse(&self) -> (Sets<R, S, T, U, V>, W);
70}
71
72impl<R, S, U, V> InverseSets<Vec<Vec<V>>, Vec<V>, V, Vec<usize>, usize, Vec<usize>>
73    for Sets<R, S, usize, U, V>
74where
75    R: IntoIterator<Item = S>,
76    S: IntoIterator<Item = usize>,
77    U: IntoIterator<Item = V>,
78    for<'a> &'a R: IntoIterator<Item = &'a S>,
79    for<'a> &'a S: IntoIterator<Item = &'a usize>,
80    for<'a> &'a U: IntoIterator<Item = &'a V>,
81    V: Copy,
82{
83    fn inverse(&self) -> (Sets<Vec<Vec<V>>, Vec<V>, V, Vec<usize>, usize>, Vec<usize>) {
84        let sets = self.unique_members();
85        let mut members = vec![vec![]; sets.len()];
86        let max_member = sets.iter().max().unwrap();
87        let mut map = vec![0; max_member + 1];
88        sets.iter()
89            .enumerate()
90            .for_each(|(index, &set)| map[set] = index);
91        (&self.sets)
92            .into_iter()
93            .zip(&self.members)
94            .for_each(|(&set, set_members)| {
95                set_members
96                    .into_iter()
97                    .for_each(|&member| members[map[member]].push(set))
98            });
99        (Sets { members, sets }, map)
100    }
101}