代数 - 全順序化

部分順序のみ与えられている型に全順序を与える. ついでに全同値も与える.

このコードは qiita.com/hatoo@github/items/fa14ad36a1b568d14f3e にあるものを拝借した. 作者の @hatoo に感謝します.

/// Algebra - Totalize PartialOrd Things
/// Thanks to: https://qiita.com/hatoo@github/items/fa14ad36a1b568d14f3e
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct Total<T>(T);
impl<T> Total<T> {
    pub fn unwrap(self) -> T {
        self.0
    }
}
impl<T: PartialEq> Eq for Total<T> {}
impl<T: PartialOrd> Ord for Total<T> {
    fn cmp(&self, rhs: &Total<T>) -> std::cmp::Ordering {
        self.0.partial_cmp(&rhs.0).unwrap()
    }
}

#[cfg(test)]
mod test_total {
    use crate::algebra::total::*;
    #[test]
    fn it_works() {
        assert_eq!(Total(0.0).unwrap(), 0.0);
        let mut v: Vec<Total<f32>> = vec![Total(2.0), Total(1.0), Total(0.0)];
        v.sort();
        assert_eq!(v, vec![Total(0.0), Total(1.0), Total(2.0)]);
    }
}