vecfx/
ord.rs

1// [[file:../vecfx.note::be82ddff][be82ddff]]
2use std::borrow::Borrow;
3
4pub use ordered_float::{Float, OrderedFloat};
5
6/// Convert a float number to OrderedFloat type
7pub trait AsOrderedFloatExt<F>
8where
9    F: Float,
10{
11    fn as_ordered_float(self) -> OrderedFloat<F>;
12}
13
14impl<F> AsOrderedFloatExt<F> for F
15where
16    F: Float,
17{
18    /// Convert a float number to OrderedFloat type
19    fn as_ordered_float(self) -> OrderedFloat<F> {
20        OrderedFloat(self)
21    }
22}
23
24/// Provides method for sorting a vec of floats
25pub trait SortByExt {
26    fn sort_by_float(&mut self);
27}
28
29impl<F: Float> SortByExt for [F] {
30    /// Sort by float numbers
31    fn sort_by_float(&mut self) {
32        self.sort_by_key(|x| OrderedFloat(*x));
33    }
34}
35// be82ddff ends here
36
37// [[file:../vecfx.note::edd3e54f][edd3e54f]]
38#[test]
39fn test_float_ord() {
40    let mut values = vec![1.0, -1.0, 2.0];
41    let mut values_ordered: Vec<_> = values.iter().map(|x| x.as_ordered_float()).collect();
42    values_ordered.sort();
43    assert_eq!(values_ordered[0], -1.0);
44    assert_eq!(values_ordered[2], 2.0);
45
46    values.sort_by_float();
47    assert_eq!(values[0], values_ordered[0].into());
48    assert_eq!(values[1], values_ordered[1].into());
49}
50// edd3e54f ends here