use crate::gaussian_rational::GaussianRational;
use core::cmp::Ordering::{self, Equal};
use malachite_base::num::arithmetic::traits::AbsSquared;
use malachite_base::num::comparison::traits::PartialOrdAbs;
use malachite_nz::gaussian_integer::GaussianInteger;
fn combine(x: Ordering, y: Ordering) -> Option<Ordering> {
if x == y || y == Equal {
Some(x)
} else if x == Equal {
Some(y)
} else {
None
}
}
impl PartialOrdAbs<GaussianInteger> for GaussianRational {
fn partial_cmp_abs(&self, other: &GaussianInteger) -> Option<Ordering> {
if let Some(o) = combine(
self.real.partial_cmp_abs(&other.real)?,
self.imaginary.partial_cmp_abs(&other.imaginary)?,
) {
return Some(o);
}
if let Some(o) = combine(
self.real.partial_cmp_abs(&other.imaginary)?,
self.imaginary.partial_cmp_abs(&other.real)?,
) {
return Some(o);
}
self.abs_squared().partial_cmp(&other.abs_squared())
}
}
impl PartialOrdAbs<GaussianRational> for GaussianInteger {
#[inline]
fn partial_cmp_abs(&self, other: &GaussianRational) -> Option<Ordering> {
other.partial_cmp_abs(self).map(Ordering::reverse)
}
}