conspire/math/set/sets/
mod.rs1use crate::math::set::Set;
2use std::cell::OnceCell;
3
4pub struct Sets<S> {
5 converse: OnceCell<Vec<Vec<usize>>>,
6 set: Set<S>,
7}
8
9impl<S> Sets<S> {
10 pub fn converse<T>(&self) -> &[Vec<usize>]
11 where
12 S: AsRef<[T]>,
13 T: AsRef<[usize]>,
14 {
15 self.converse.get_or_init(|| {
16 let num_inner = self
17 .members()
18 .as_ref()
19 .iter()
20 .flat_map(|row| row.as_ref().iter().copied())
21 .max()
22 .map_or(0, |m| m + 1);
23 let mut converse = vec![Vec::new(); num_inner];
24 for (outer, row) in self.members().as_ref().iter().enumerate() {
25 for &inner in row.as_ref() {
26 converse[inner].push(outer);
27 }
28 }
29 converse
30 })
31 }
32 pub fn members(&self) -> &S {
33 self.set.members()
34 }
35 pub fn into_members(self) -> S {
36 self.set.into_members()
37 }
38 pub fn numbers(&self) -> Option<&[usize]> {
39 self.set.numbers()
40 }
41 pub fn set(&self) -> &Set<S> {
42 &self.set
43 }
44 pub fn set_numbers(&mut self, numbers: Vec<usize>) {
45 self.set.set_numbers(numbers);
46 }
47}
48
49impl<S> From<S> for Sets<S> {
50 fn from(members: S) -> Self {
51 Set::from(members).into()
52 }
53}
54
55impl<S> From<Set<S>> for Sets<S> {
56 fn from(set: Set<S>) -> Self {
57 Self {
58 converse: OnceCell::new(),
59 set,
60 }
61 }
62}
63
64impl<S> From<Sets<S>> for Set<S> {
65 fn from(sets: Sets<S>) -> Self {
66 sets.set
67 }
68}