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}