docchi_core/imp/structs/
null_or.rs

1use crate::imp::structs::qv::Qv;
2#[derive(Debug, PartialEq)]
3pub enum NullOr<T>{
4    Val(T),
5    Null
6}
7#[derive(Debug, PartialEq)]
8pub enum UndefOr<T>{
9    Val(T),
10    Undefined,
11}
12
13impl<T : Clone> Clone for NullOr<T>{
14    fn clone(&self) -> Self { self.as_ref().map(|t| t.clone()) }
15}
16
17impl<T : Clone> Clone for UndefOr<T>{
18    fn clone(&self) -> Self {
19        self.as_ref().map(|t| t.clone())
20    }
21}
22
23impl<T : Copy> Copy for NullOr<T>{}
24impl<T : Copy> Copy for UndefOr<T>{}
25
26impl<T> From<Option<T>> for NullOr<T>{
27    fn from(opt: Option<T>) -> Self { NullOr::from_opt(opt) }
28}
29impl<T> From<Option<T>> for UndefOr<T> {
30    fn from(opt: Option<T>) -> Self { UndefOr::from_opt(opt) }
31}
32impl<T> From<NullOr<T>> for Option<T>{
33    fn from(n: NullOr<T>) -> Self { n.into_value() }
34}
35impl<T> From<UndefOr<T>> for Option<T> {
36    fn from(u: UndefOr<T>) -> Self { u.into_value() }
37}
38
39impl<T> NullOr<T>{
40    pub fn as_ref(&self) -> NullOr<&T>{
41        match self{
42            NullOr::Val(v) => NullOr::Val(v),
43            NullOr::Null => NullOr::Null,
44        }
45    }
46
47    pub fn map<U>(self, f : impl FnOnce(T) -> U) -> NullOr<U> {
48        match self {
49            NullOr::Val(v) => NullOr::Val(f(v)),
50            NullOr::Null => NullOr::Null,
51        }
52    }
53
54    pub fn opt_map<U>(self, f : impl FnOnce(T) -> Option<U>) -> Option<NullOr<U>>{
55        match self {
56            NullOr::Val(v) => f(v).map(|r| NullOr::Val(r)),
57            NullOr::Null => Some(NullOr::Null),
58        }
59    }
60
61    pub fn from_qv(v : Qv<T>) -> Option<NullOr<T>>{
62        match v{
63            Qv::Val(v) => Some(NullOr::Val(v)),
64            Qv::Null => Some(NullOr::Null),
65            Qv::Undefined => None,
66        }
67    }
68
69    pub fn into_qv(self) -> Qv<T>{
70        match self{
71            NullOr::Val(v) => Qv::Val(v),
72            NullOr::Null => Qv::Null,
73        }
74    }
75
76    pub fn into_value(self) -> Option<T>{
77        match self{
78            NullOr::Val(v) => Some(v),
79            _ => None,
80        }
81    }
82
83    pub fn from_opt(opt : Option<T>) -> NullOr<T>{
84        match opt{
85            Some(v) => NullOr::Val(v),
86            None => NullOr::Null,
87        }
88    }
89}
90
91
92
93impl<T> UndefOr<T>{
94    pub fn as_ref(&self) -> UndefOr<&T>{
95        match self{
96            UndefOr::Val(v) => UndefOr::Val(v),
97            UndefOr::Undefined => UndefOr::Undefined,
98        }
99    }
100
101    pub fn map<U>(self, f : impl FnOnce(T) -> U) -> UndefOr<U> {
102        match self {
103            UndefOr::Val(v) => UndefOr::Val(f(v)),
104            UndefOr::Undefined => UndefOr::Undefined,
105        }
106    }
107
108
109    pub fn opt_map<U>(self, f : impl FnOnce(T) -> Option<U>) -> Option<UndefOr<U>>{
110        match self {
111            UndefOr::Val(v) => f(v).map(|r| UndefOr::Val(r)),
112            UndefOr::Undefined => Some(UndefOr::Undefined),
113        }
114    }
115
116    pub fn from_qv(v : Qv<T>) -> Option<UndefOr<T>>{
117        match v{
118            Qv::Val(v) => Some(UndefOr::Val(v)),
119            Qv::Undefined => Some(UndefOr::Undefined),
120            Qv::Null => None,
121        }
122    }
123
124    pub fn into_qv(self) -> Qv<T>{
125        match self{
126            UndefOr::Val(v) => Qv::Val(v),
127            UndefOr::Undefined => Qv::Undefined,
128        }
129    }
130
131    pub fn into_value(self) -> Option<T>{
132        match self{
133            UndefOr::Val(v) => Some(v),
134            _ => None,
135        }
136    }
137
138    pub fn from_opt(opt : Option<T>) -> UndefOr<T>{
139        match opt{
140            Some(v) => UndefOr::Val(v),
141            None => UndefOr::Undefined,
142        }
143    }
144}