icydb_core/value/ops/
partial_ord.rs1use crate::value::Value;
8use std::cmp::Ordering;
9
10impl PartialOrd for Value {
16 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
17 match (self, other) {
18 (Self::Bool(a), Self::Bool(b)) => a.partial_cmp(b),
19 (Self::Date(a), Self::Date(b)) => a.partial_cmp(b),
20 (Self::Decimal(a), Self::Decimal(b)) => a.partial_cmp(b),
21 (Self::Duration(a), Self::Duration(b)) => a.partial_cmp(b),
22 (Self::Enum(a), Self::Enum(b)) => a.partial_cmp(b),
23 (Self::Float32(a), Self::Float32(b)) => a.partial_cmp(b),
24 (Self::Float64(a), Self::Float64(b)) => a.partial_cmp(b),
25 (Self::Int64(a), Self::Int64(b)) => a.partial_cmp(b),
26 (Self::Int128(a), Self::Int128(b)) => a.partial_cmp(b),
27 (Self::IntBig(a), Self::IntBig(b)) => a.partial_cmp(b),
28 (Self::Principal(a), Self::Principal(b)) => a.partial_cmp(b),
29 (Self::Subaccount(a), Self::Subaccount(b)) => a.partial_cmp(b),
30 (Self::Text(a), Self::Text(b)) => a.partial_cmp(b),
31 (Self::Timestamp(a), Self::Timestamp(b)) => a.partial_cmp(b),
32 (Self::Nat64(a), Self::Nat64(b)) => a.partial_cmp(b),
33 (Self::Nat128(a), Self::Nat128(b)) => a.partial_cmp(b),
34 (Self::NatBig(a), Self::NatBig(b)) => a.partial_cmp(b),
35 (Self::Ulid(a), Self::Ulid(b)) => a.partial_cmp(b),
36 (Self::U256(a), Self::U256(b)) => a.partial_cmp(b),
37 (Self::Map(a), Self::Map(b)) => partial_cmp_map(a.as_slice(), b.as_slice()),
38
39 _ => None,
41 }
42 }
43}
44
45fn partial_cmp_map(left: &[(Value, Value)], right: &[(Value, Value)]) -> Option<Ordering> {
46 for ((left_key, left_value), (right_key, right_value)) in left.iter().zip(right.iter()) {
47 let key_cmp = Value::canonical_cmp_key(left_key, right_key);
48 if key_cmp != Ordering::Equal {
49 return Some(key_cmp);
50 }
51
52 match left_value.partial_cmp(right_value) {
53 Some(Ordering::Equal) => {}
54 non_eq => return non_eq,
55 }
56 }
57
58 left.len().partial_cmp(&right.len())
59}