1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use std::cmp::Ordering; pub enum Infinitable<T> { Finite(T), Infinity, NegativeInfinity, } impl<T> Infinitable<T> { pub fn is_finite(&self) -> bool { match self { &Infinitable::Finite(_) => true, _ => false, } } } impl<T> PartialEq for Infinitable<T> where T: PartialEq { fn eq(&self, other: &Self) -> bool { match (self, other) { (&Infinitable::Infinity, &Infinitable::Infinity) | (&Infinitable::NegativeInfinity, &Infinitable::NegativeInfinity) => true, (&Infinitable::Finite(ref x), &Infinitable::Finite(ref y)) => x == y, (..) => false, } } } impl<T> Eq for Infinitable<T> where T: Eq { } impl<T> PartialOrd for Infinitable<T> where T: PartialOrd { fn partial_cmp(&self, other: &Self) -> Option<Ordering> { match (self, other) { (&Infinitable::Infinity, &Infinitable::Infinity) | (&Infinitable::NegativeInfinity, &Infinitable::NegativeInfinity) => Some(Ordering::Equal), (&Infinitable::Infinity, _) | (_, &Infinitable::NegativeInfinity) => Some(Ordering::Greater), (&Infinitable::NegativeInfinity, _) | (_, &Infinitable::Infinity) => Some(Ordering::Less), (&Infinitable::Finite(ref x), &Infinitable::Finite(ref y)) => x.partial_cmp(y), } } } impl<T> Ord for Infinitable<T> where T: Ord { fn cmp(&self, other: &Self) -> Ordering { match (self, other) { (&Infinitable::Finite(ref x), &Infinitable::Finite(ref y)) => x.cmp(y), (..) => self.partial_cmp(other).unwrap(), } } }