use std::cmp::Ordering;
use crate::value::ElementProperty;
use crate::value::number::{N, Number};
pub(crate) fn compare_numbers(a: &Number, b: &Number) -> Option<Ordering> {
match (&a.n, &b.n) {
(N::NegInt(a), N::NegInt(b)) => Some(a.cmp(b)),
(N::Float(a), N::Float(b)) => a.0.partial_cmp(&b.0),
(N::NegInt(a), N::Float(b)) => (*a as f64).partial_cmp(&b.0),
(N::Float(a), N::NegInt(b)) => a.0.partial_cmp(&(*b as f64)),
}
}
pub(crate) fn compare_scalars(a: &ElementProperty, b: &ElementProperty) -> Option<Ordering> {
match (a, b) {
(ElementProperty::Number(a), ElementProperty::Number(b)) => compare_numbers(a, b),
(ElementProperty::String(a), ElementProperty::String(b)) => {
Some(a.as_str().cmp(b.as_str()))
}
(a, b) if a.is_text() && b.is_text() => {
a.with_text(|a| b.with_text(|b| a.cmp(b))).flatten()
}
(ElementProperty::Boolean(a), ElementProperty::Boolean(b)) => Some(a.cmp(b)),
(ElementProperty::Uuid(a), ElementProperty::Uuid(b)) => Some(a.cmp(b)),
_ => None,
}
}