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