baseunits_rs/intervals/
limit_value.rs

1use 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}