tc_value/
lib.rs

1//! A generic scalar [`Value`] enum which supports collation.
2
3pub extern crate uuid;
4
5use std::cmp::Ordering;
6use std::sync::Arc;
7
8use collate::{Collate, Collator};
9
10use tcgeneric::Instance;
11
12pub use class::*;
13pub use link::*;
14pub use number::*;
15pub use string::*;
16pub use tcgeneric::link;
17pub use value::*;
18pub use version::*;
19
20mod class;
21mod number {
22    pub use number_general::{
23        Boolean, BooleanType, Complex, ComplexType, DType, Float, FloatInstance, FloatType, Int,
24        IntType, Number, NumberClass, NumberCollator, NumberInstance, NumberType, Trigonometry,
25        UInt, UIntType,
26    };
27}
28
29mod string;
30mod value;
31mod version;
32
33/// [`Collate`] support for [`Value`]
34#[derive(Default, Clone, Eq, PartialEq)]
35pub struct ValueCollator {
36    bytes: Collator<Arc<[u8]>>,
37    link: Collator<Link>,
38    number: NumberCollator,
39    string: StringCollator,
40    version: Collator<Version>,
41}
42
43impl Collate for ValueCollator {
44    type Value = Value;
45
46    fn cmp(&self, left: &Self::Value, right: &Self::Value) -> Ordering {
47        match (left, right) {
48            (Value::Bytes(l), Value::Bytes(r)) => self.bytes.cmp(l, r),
49            (Value::Link(l), Value::Link(r)) => self.link.cmp(l, r),
50            (Value::Number(l), Value::Number(r)) => self.number.cmp(l, r),
51            (Value::Version(l), Value::Version(r)) => self.version.cmp(l, r),
52            (Value::String(l), Value::String(r)) => self.string.cmp(l, r),
53            (Value::Tuple(l), Value::Tuple(r)) => {
54                for i in 0..Ord::min(l.len(), r.len()) {
55                    match self.cmp(&l[i], &r[i]) {
56                        Ordering::Equal => {}
57                        ordering => return ordering,
58                    }
59                }
60
61                Ordering::Equal
62            }
63            (l, r) => l.class().cmp(&r.class()),
64        }
65    }
66}