Skip to main content

conspire/math/set/sets/
mod.rs

1use 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}