#[cfg(test)]
use std::fmt::Debug;
use std::ops::Mul;
#[cfg(test)]
use super::assert_abelian_group_laws;
use super::AbelianGroup;
use super::CommutativeRing;
pub trait Module<Scalar>: AbelianGroup + Mul<Scalar, Output = Self>
where Scalar: CommutativeRing
{
}
#[cfg(test)]
pub fn assert_module_action_laws<Scalar, Element>(scalars: &[Scalar], elements: &[Element])
where
Scalar: CommutativeRing + Clone + Eq + Debug,
Element: Module<Scalar> + Clone + Eq + Debug,
{
assert_abelian_group_laws(elements);
for s in scalars {
for t in scalars {
for a in elements {
let lhs = a.clone() * (s.clone() + t.clone());
let rhs = (a.clone() * s.clone()) + (a.clone() * t.clone());
assert_eq!(lhs, rhs);
let lhs = a.clone() * (s.clone() * t.clone());
let rhs = (a.clone() * s.clone()) * t.clone();
assert_eq!(lhs, rhs);
for b in elements {
let lhs = (a.clone() + b.clone()) * s.clone();
let rhs = (a.clone() * s.clone()) + (b.clone() * s.clone());
assert_eq!(lhs, rhs);
}
}
}
for a in elements {
assert_eq!(a.clone() * Scalar::one(), *a);
}
}
}