1use std::collections::BTreeSet;
2
3use crate::traits::FiniteRelation;
4
5#[derive(Clone, Debug, PartialEq, Eq)]
37pub struct UnaryRelation<T: Ord> {
38 values: BTreeSet<T>,
39}
40
41impl<T: Ord> UnaryRelation<T> {
42 #[must_use]
44 pub fn new() -> Self {
45 Self {
46 values: BTreeSet::new(),
47 }
48 }
49
50 #[must_use]
54 pub fn from_values<I>(values: I) -> Self
55 where
56 I: IntoIterator<Item = T>,
57 {
58 values.into_iter().collect()
59 }
60
61 #[must_use]
63 pub fn singleton(value: T) -> Self {
64 let mut values = BTreeSet::new();
65 values.insert(value);
66 Self { values }
67 }
68
69 pub fn insert(&mut self, value: T) -> bool {
73 self.values.insert(value)
74 }
75
76 #[must_use]
78 pub fn contains(&self, value: &T) -> bool {
79 self.values.contains(value)
80 }
81
82 pub fn iter(&self) -> impl Iterator<Item = &T> {
86 self.values.iter()
87 }
88
89 #[must_use]
91 pub fn union(&self, other: &Self) -> Self
92 where
93 T: Clone,
94 {
95 self.values.union(&other.values).cloned().collect()
96 }
97
98 #[must_use]
100 pub fn intersection(&self, other: &Self) -> Self
101 where
102 T: Clone,
103 {
104 self.values.intersection(&other.values).cloned().collect()
105 }
106
107 #[must_use]
109 pub fn difference(&self, other: &Self) -> Self
110 where
111 T: Clone,
112 {
113 self.values.difference(&other.values).cloned().collect()
114 }
115
116 #[must_use]
118 pub fn is_subset(&self, other: &Self) -> bool {
119 self.values.is_subset(&other.values)
120 }
121
122 #[must_use]
124 pub fn to_vec(&self) -> Vec<T>
125 where
126 T: Clone,
127 {
128 self.values.iter().cloned().collect()
129 }
130}
131
132impl<T: Ord> Default for UnaryRelation<T> {
133 fn default() -> Self {
134 Self::new()
135 }
136}
137
138impl<T: Ord> FiniteRelation for UnaryRelation<T> {
139 fn len(&self) -> usize {
140 self.values.len()
141 }
142}
143
144impl<T: Ord> FromIterator<T> for UnaryRelation<T> {
145 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
146 Self {
147 values: iter.into_iter().collect(),
148 }
149 }
150}
151
152impl<T: Ord> Extend<T> for UnaryRelation<T> {
153 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
154 self.values.extend(iter);
155 }
156}
157
158impl<T: Ord> IntoIterator for UnaryRelation<T> {
159 type Item = T;
160 type IntoIter = std::collections::btree_set::IntoIter<T>;
161
162 fn into_iter(self) -> Self::IntoIter {
163 self.values.into_iter()
164 }
165}
166
167impl<'a, T: Ord> IntoIterator for &'a UnaryRelation<T> {
168 type Item = &'a T;
169 type IntoIter = std::collections::btree_set::Iter<'a, T>;
170
171 fn into_iter(self) -> Self::IntoIter {
172 self.values.iter()
173 }
174}