#[cfg(test)]
use std::fmt::Debug;
#[cfg(test)]
use super::assert_commutative_ring_laws;
use super::CommutativeRing;
pub trait Field: CommutativeRing {
fn try_inverse(&self) -> Option<Self>;
}
#[cfg(test)]
pub fn assert_field_laws<T>(values: &[T])
where T: Field + Clone + Eq + Debug {
assert_commutative_ring_laws(values);
assert_ne!(T::zero(), T::one());
for a in values {
if a.is_zero() {
assert_eq!(a.try_inverse(), None);
continue;
}
let Some(inverse) = a.try_inverse() else {
panic!("non-zero field element has no inverse");
};
assert_eq!(a.clone() * inverse.clone(), T::one());
assert_eq!(inverse * a.clone(), T::one());
}
}