Skip to main content

conspire/math/set/
mod.rs

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