baseunits_rs/intervals/
limit_value.rs1use std::cmp::Ordering;
2
3#[derive(Debug, Clone)]
4pub enum LimitValue<T> {
5 Limit(T),
6 Limitless,
7}
8
9impl<T: Clone + Default> Default for LimitValue<T> {
10 fn default() -> Self {
11 LimitValue::Limitless
12 }
13}
14
15impl<T: Clone + Default + PartialOrd> PartialOrd for LimitValue<T> {
16 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
17 match (self, other) {
18 (LimitValue::Limit(ref value), LimitValue::Limit(ref other_value)) => {
19 value.partial_cmp(other_value)
20 }
21 (LimitValue::Limit(_), _) => Some(Ordering::Greater),
22 (LimitValue::Limitless, LimitValue::Limitless) => Some(Ordering::Equal),
23 (LimitValue::Limitless, _) => Some(Ordering::Less),
24 }
25 }
26}
27
28impl<T: Clone + Default + PartialEq + PartialOrd> PartialEq for LimitValue<T> {
29 fn eq(&self, other: &Self) -> bool {
30 match (self, other) {
31 (&LimitValue::Limitless, &LimitValue::Limitless) => true,
32 (&LimitValue::Limit(ref value), &LimitValue::Limit(ref other_value)) => value == other_value,
33 (..) => false,
34 }
35 }
36}
37
38impl<T: Clone + Default + PartialOrd> Eq for LimitValue<T> {}
39
40impl<T: Clone + Default> LimitValue<T> {
41 pub fn to_value(&self) -> &T {
42 match self {
43 LimitValue::Limit(ref t) => t,
44 LimitValue::Limitless => panic!(""),
45 }
46 }
47
48 pub fn to_value_or_else<'a, 'b>(&'a self, default: &'b T) -> &'a T
49 where
50 'b: 'a,
51 {
52 match self {
53 LimitValue::Limit(ref t) => t,
54 LimitValue::Limitless => default,
55 }
56 }
57}