frozen_collections_core/traits/
set_ops.rs1use crate::sets::{Difference, Intersection, SymmetricDifference, Union};
2use crate::traits::Set;
3
4pub trait SetOps<T> {
6 #[must_use]
9 fn union<'a, ST>(&'a self, other: &'a ST) -> Union<'a, Self, ST, T>
10 where
11 ST: Set<T>,
12 Self: Sized + Set<T>,
13 {
14 Union::new(self, other)
15 }
16
17 #[must_use]
20 fn symmetric_difference<'a, ST>(&'a self, other: &'a ST) -> SymmetricDifference<'a, Self, ST, T>
21 where
22 ST: Set<T>,
23 Self: Sized + Set<T>,
24 {
25 SymmetricDifference::new(self, other)
26 }
27
28 #[must_use]
31 fn difference<'a, ST>(&'a self, other: &'a ST) -> Difference<'a, Self, ST, T>
32 where
33 ST: Set<T>,
34 Self: Sized + Set<T>,
35 {
36 Difference::new(self, other)
37 }
38
39 #[must_use]
48 fn intersection<'a, ST>(&'a self, other: &'a ST) -> Intersection<'a, Self, ST, T>
49 where
50 ST: Set<T>,
51 Self: Sized + Set<T>,
52 {
53 Intersection::new(self, other)
54 }
55
56 #[must_use]
59 #[mutants::skip]
60 fn is_disjoint<'a, ST>(&'a self, other: &'a ST) -> bool
61 where
62 ST: Set<T>,
63 Self: Sized + Set<T>,
64 {
65 if self.len() <= other.len() {
66 self.iter().all(|v| !other.contains(v))
67 } else {
68 other.iter().all(|v| !self.contains(v))
69 }
70 }
71
72 #[must_use]
75 fn is_subset<'a, ST>(&'a self, other: &'a ST) -> bool
76 where
77 ST: Set<T>,
78 Self: Sized + Set<T>,
79 {
80 if self.len() <= other.len() {
81 self.iter().all(|v| other.contains(v))
82 } else {
83 false
84 }
85 }
86
87 #[must_use]
90 fn is_superset<'a, ST>(&'a self, other: &'a ST) -> bool
91 where
92 ST: Set<T>,
93 Self: Sized + Set<T>,
94 {
95 if other.len() <= self.len() {
96 other.iter().all(|v| self.contains(v))
97 } else {
98 false
99 }
100 }
101}
102
103impl<ST, T> SetOps<T> for ST where ST: Set<T> {}