Expand description
Provides a wrapper for types that can technically implement PartialOrd/Ord
but for semantic reasons it is nonsensical.
Examples
use std::cmp::Ordering;
use std::collections::BTreeMap;
use ordered::{ArbitraryOrd, Ordered};
/// A Foo type.
///
/// We do not want users to be able to write `a < b` because it is meaningless
/// to compare the two but we wish to use `Foo`, for example, as a `BTreeMap` key.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
enum Foo {
/// A space foo.
Space(u32),
/// A time foo.
Time(u32)
}
impl ArbitraryOrd for Foo {
fn arbitrary_cmp(&self, other: &Self) -> Ordering {
use Foo::*;
match (self, other) {
(Space(_), Time(_)) => Ordering::Less,
(Time(_), Space(_)) => Ordering::Greater,
(Space(this), Space(that)) => this.cmp(that),
(Time(this), Time(that)) => this.cmp(that),
}
}
}
let a = Foo::Space(50);
let b = Foo::Time(50);
let mut map = BTreeMap::new();
// error[E0277]: the trait bound `Foo: Ord` is not satisfied
// map.insert(a, "some interesting value");
map.insert(Ordered(a), "some interesting value");
map.insert(Ordered(b), "some other interesting value");Structs
- A wrapper type that implements
PartialOrdandOrd.
Traits
- Trait for types that perform an arbitrary ordering.