Skip to main content

key_set/
lib.rs

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}