Skip to main content

conspire/math/set/
mod.rs

1pub mod sets;
2
3use crate::math::Tensor;
4use std::vec::IntoIter;
5
6pub struct Set<S> {
7    members: S,
8    numbers: Option<Vec<usize>>,
9}
10
11impl<S> Set<S> {
12    pub fn members(&self) -> &S {
13        &self.members
14    }
15    pub fn members_mut(&mut self) -> &mut S {
16        &mut self.members
17    }
18    pub fn into_members(self) -> S {
19        self.members
20    }
21    pub fn numbers(&self) -> Option<&[usize]> {
22        self.numbers.as_deref()
23    }
24    pub fn set_numbers(&mut self, numbers: Vec<usize>) {
25        self.numbers = Some(numbers);
26    }
27}
28
29impl<S> From<S> for Set<S> {
30    fn from(members: S) -> Self {
31        Self {
32            members,
33            numbers: None,
34        }
35    }
36}
37
38impl<S> From<(S, Vec<usize>)> for Set<S> {
39    fn from((members, numbers): (S, Vec<usize>)) -> Self {
40        Self {
41            members,
42            numbers: Some(numbers),
43        }
44    }
45}
46
47impl<S> From<Set<S>> for (S, Option<Vec<usize>>) {
48    fn from(set: Set<S>) -> Self {
49        (set.members, set.numbers)
50    }
51}
52
53impl<S, T> IntoIterator for Set<S>
54where
55    S: IntoIterator<Item = T, IntoIter = IntoIter<T>>,
56{
57    type Item = T;
58    type IntoIter = IntoIter<Self::Item>;
59    fn into_iter(self) -> Self::IntoIter {
60        self.members.into_iter()
61    }
62}
63
64impl<S> Set<S>
65where
66    S: Tensor,
67{
68    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut S::Item> {
69        self.members.iter_mut()
70    }
71}