gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

HTML 5364Rust 86Markdown 12TOML 91841 Sutichaykuna

⎇ 4c14991d8cb32e0b8f87b0dde48035a1d493331d src/number.rs Rust · 223 siq'ikuna · 5.4 KB Ñawpa willay Pi imata llamkarqan ch'uya

added prelude + some refactoring 4c14991d8 · Adam Nemecek ·

1use core::ops;
2
3#[derive(Copy, Clone, PartialEq, Debug)]
4#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
5#[cfg_attr(all(feature = "serde", feature = "serde_kebab_case"), serde(rename_all = "kebab-case"))]
6#[cfg_attr(all(feature = "serde", feature = "serde_camel_case"), serde(rename_all = "camelCase"))]
7pub enum Number {
8    Defined(f32),
9    Undefined,
10}
11
12pub trait ToNumber {
13    fn to_number(self) -> Number;
14}
15
16pub trait OrElse<T> {
17    fn or_else(self, other: T) -> T;
18}
19
20impl Default for Number {
21    fn default() -> Self {
22        Self::Undefined
23    }
24}
25
26impl OrElse<f32> for Number {
27    fn or_else(self, other: f32) -> f32 {
28        match self {
29            Number::Defined(val) => val,
30            Number::Undefined => other,
31        }
32    }
33}
34
35impl OrElse<Self> for Number {
36    fn or_else(self, other: Self) -> Self {
37        match self {
38            Number::Defined(_) => self,
39            Number::Undefined => other,
40        }
41    }
42}
43
44impl Number {
45    pub fn is_defined(self) -> bool {
46        match self {
47            Number::Defined(_) => true,
48            Number::Undefined => false,
49        }
50    }
51
52    pub fn is_undefined(self) -> bool {
53        match self {
54            Number::Defined(_) => false,
55            Number::Undefined => true,
56        }
57    }
58}
59
60pub trait MinMax<In, Out> {
61    fn maybe_min(self, rhs: In) -> Out;
62    fn maybe_max(self, rhs: In) -> Out;
63}
64
65impl MinMax<Self, Self> for Number {
66    fn maybe_min(self, rhs: Self) -> Self {
67        match self {
68            Number::Defined(val) => match rhs {
69                Number::Defined(other) => Number::Defined(val.min(other)),
70                Number::Undefined => self,
71            },
72            Number::Undefined => Number::Undefined,
73        }
74    }
75
76    fn maybe_max(self, rhs: Self) -> Self {
77        match self {
78            Number::Defined(val) => match rhs {
79                Number::Defined(other) => Number::Defined(val.max(other)),
80                Number::Undefined => self,
81            },
82            Number::Undefined => Number::Undefined,
83        }
84    }
85}
86
87impl MinMax<f32, Number> for Number {
88    fn maybe_min(self, rhs: f32) -> Number {
89        match self {
90            Number::Defined(val) => Number::Defined(val.min(rhs)),
91            Number::Undefined => Number::Undefined,
92        }
93    }
94
95    fn maybe_max(self, rhs: f32) -> Number {
96        match self {
97            Number::Defined(val) => Number::Defined(val.max(rhs)),
98            Number::Undefined => Number::Undefined,
99        }
100    }
101}
102
103impl MinMax<Number, f32> for f32 {
104    fn maybe_min(self, rhs: Number) -> f32 {
105        match rhs {
106            Number::Defined(val) => self.min(val),
107            Number::Undefined => self,
108        }
109    }
110
111    fn maybe_max(self, rhs: Number) -> f32 {
112        match rhs {
113            Number::Defined(val) => self.max(val),
114            Number::Undefined => self,
115        }
116    }
117}
118
119impl ToNumber for f32 {
120    fn to_number(self) -> Number {
121        Number::Defined(self)
122    }
123}
124
125impl ops::Add<f32> for Number {
126    type Output = Number;
127
128    fn add(self, rhs: f32) -> Self {
129        match self {
130            Number::Defined(val) => Number::Defined(val + rhs),
131            Number::Undefined => Number::Undefined,
132        }
133    }
134}
135
136impl ops::Add<Number> for Number {
137    type Output = Number;
138
139    fn add(self, rhs: Self) -> Self {
140        match self {
141            Number::Defined(val) => match rhs {
142                Number::Defined(other) => Number::Defined(val + other),
143                Number::Undefined => self,
144            },
145            Number::Undefined => Number::Undefined,
146        }
147    }
148}
149
150impl ops::Sub<f32> for Number {
151    type Output = Number;
152
153    fn sub(self, rhs: f32) -> Self {
154        match self {
155            Number::Defined(val) => Number::Defined(val - rhs),
156            Number::Undefined => Number::Undefined,
157        }
158    }
159}
160
161impl ops::Sub<Number> for Number {
162    type Output = Number;
163
164    fn sub(self, rhs: Self) -> Self {
165        match self {
166            Number::Defined(val) => match rhs {
167                Number::Defined(other) => Number::Defined(val - other),
168                Number::Undefined => self,
169            },
170            Number::Undefined => Number::Undefined,
171        }
172    }
173}
174
175impl ops::Mul<f32> for Number {
176    type Output = Number;
177
178    fn mul(self, rhs: f32) -> Self {
179        match self {
180            Number::Defined(val) => Number::Defined(val * rhs),
181            Number::Undefined => Number::Undefined,
182        }
183    }
184}
185
186impl ops::Mul<Number> for Number {
187    type Output = Number;
188
189    fn mul(self, rhs: Self) -> Self {
190        match self {
191            Number::Defined(val) => match rhs {
192                Number::Defined(other) => Number::Defined(val * other),
193                Number::Undefined => self,
194            },
195            Number::Undefined => Number::Undefined,
196        }
197    }
198}
199
200impl ops::Div<f32> for Number {
201    type Output = Number;
202
203    fn div(self, rhs: f32) -> Self {
204        match self {
205            Number::Defined(val) => Number::Defined(val / rhs),
206            Number::Undefined => Number::Undefined,
207        }
208    }
209}
210
211impl ops::Div<Number> for Number {
212    type Output = Number;
213
214    fn div(self, rhs: Self) -> Self {
215        match self {
216            Number::Defined(val) => match rhs {
217                Number::Defined(other) => Number::Defined(val / other),
218                Number::Undefined => self,
219            },
220            Number::Undefined => Number::Undefined,
221        }
222    }
223}