#![doc(include = "../../doc/references.md")]
use crate::group::*;
pub trait ComGroup: Group {}
pub trait ComGroupLaws: ComGroup {
fn commutivity(&self, x: &Self) -> bool {
self.op(x) == x.op(self)
}
}
impl<G: ComGroup> ComGroupLaws for G {}
impl ComGroup for () {}
impl<A: ComGroup> ComGroup for (A,) {}
impl<A: ComGroup, B: ComGroup> ComGroup for (A, B) {}
impl<A: ComGroup, B: ComGroup, C: ComGroup> ComGroup for (A, B, C) {}
macro_rules! array_com_group {
($size:expr) => {
impl<T: Copy + ComGroup> ComGroup for [T; $size] {}
};
($size:expr, $($others:expr),+) => {
array_com_group! {$size}
array_com_group! {$($others),+}
};
}
array_com_group! {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
}