1use crate::intersect::{
2 intersect_from_all, intersect_from_all_except_some, intersect_from_none, intersect_from_some,
3};
4use crate::remove::{
5 remove_from_all, remove_from_all_except_some, remove_from_none, remove_from_some,
6};
7use crate::utils::clean_vec;
8use serde::{Deserialize, Serialize};
9use std::fmt::Debug;
10
11mod intersect;
12mod remove;
13mod utils;
14
15#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
16pub enum KeySet<T>
17where
18 T: Ord + Debug + Clone,
19{
20 None,
21 Some(Vec<T>),
22 AllExceptSome(Vec<T>),
23 All,
24}
25
26impl<T> KeySet<T>
27where
28 T: Ord + Debug + Clone,
29{
30 pub fn for_some(elements: &Vec<T>) -> KeySet<T> {
31 let vec = clean_vec(elements.clone());
32 utils::make_some_with(vec)
33 }
34
35 pub fn for_all_except_some(elements: &Vec<T>) -> KeySet<T> {
36 let vec = clean_vec(elements.clone());
37 utils::make_all_except_some_with(vec)
38 }
39
40 pub fn invert(&self) -> Self {
41 match self {
42 KeySet::All => KeySet::None,
43 KeySet::None => KeySet::All,
44 KeySet::Some(e) => KeySet::AllExceptSome(e.clone()),
45 KeySet::AllExceptSome(e) => KeySet::Some(e.clone()),
46 }
47 }
48
49 pub fn contains(&self, element: &T) -> bool {
50 match self {
51 KeySet::All => true,
52 KeySet::None => false,
53 KeySet::Some(e) => e.contains(&element),
54 KeySet::AllExceptSome(e) => !e.contains(&element),
55 }
56 }
57
58 pub fn remove(&self, other: &KeySet<T>) -> KeySet<T> {
59 match self {
60 KeySet::All => remove_from_all(other),
61 KeySet::None => remove_from_none(other),
62 KeySet::Some(e) => remove_from_some(e, other),
63 KeySet::AllExceptSome(e) => remove_from_all_except_some(e, other),
64 }
65 }
66
67 pub fn intersect(&self, other: &KeySet<T>) -> KeySet<T> {
68 match self {
69 KeySet::All => intersect_from_all(other),
70 KeySet::None => intersect_from_none(other),
71 KeySet::Some(e) => intersect_from_some(e, other),
72 KeySet::AllExceptSome(e) => intersect_from_all_except_some(e, other),
73 }
74 }
75}
76
77impl<T> std::fmt::Display for KeySet<T>
78where
79 T: Ord + Debug + Clone,
80{
81 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
82 match self {
83 KeySet::All => write!(f, "KeySet::All"),
84 KeySet::None => write!(f, "KeySet::None"),
85 KeySet::Some(e) => write!(f, "KeySet::Some({:?})", e),
86 KeySet::AllExceptSome(e) => write!(f, "KeySet::AllExceptSome({:?})", e),
87 }
88 }
89}
90
91impl<T> Clone for KeySet<T>
92where
93 T: Ord + Debug + Clone,
94{
95 fn clone(&self) -> Self {
96 match self {
97 KeySet::All => KeySet::All,
98 KeySet::None => KeySet::None,
99 KeySet::Some(e) => KeySet::Some(e.clone()),
100 KeySet::AllExceptSome(e) => KeySet::AllExceptSome(e.clone()),
101 }
102 }
103}
104
105impl<T> Default for KeySet<T>
106where
107 T: Ord + Debug + Clone,
108{
109 fn default() -> Self {
110 Self::All
111 }
112}