docchi_core/imp/structs/
null_or.rs1use 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}