algebraeon_groups/examples/
c2.rs

1use algebraeon_macros::CanonicalStructure;
2use algebraeon_sets::structure::{EqSignature, MetaType, SetSignature, Signature};
3
4use crate::structure::{
5    AssociativeCompositionSignature, CompositionSignature, GroupSignature, IdentitySignature,
6    LeftCancellativeCompositionSignature, MonoidSignature, RightCancellativeCompositionSignature,
7    TryInverseSignature, TryLeftInverseSignature, TryRightInverseSignature,
8};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, CanonicalStructure)]
11#[canonical_structure(eq)]
12pub enum C2 {
13    Identity,
14    Flip,
15}
16
17impl CompositionSignature for C2CanonicalStructure {
18    fn compose(&self, a: &Self::Set, b: &Self::Set) -> Self::Set {
19        match (a, b) {
20            (C2::Identity, C2::Identity) => C2::Identity,
21            (C2::Identity, C2::Flip) => C2::Flip,
22            (C2::Flip, C2::Identity) => C2::Flip,
23            (C2::Flip, C2::Flip) => C2::Identity,
24        }
25    }
26}
27
28impl AssociativeCompositionSignature for C2CanonicalStructure {}
29
30impl LeftCancellativeCompositionSignature for C2CanonicalStructure {
31    fn try_left_difference(&self, a: &Self::Set, b: &Self::Set) -> Option<Self::Set> {
32        Some(self.compose(&self.inverse(b), a))
33    }
34}
35
36impl RightCancellativeCompositionSignature for C2CanonicalStructure {
37    fn try_right_difference(&self, a: &Self::Set, b: &Self::Set) -> Option<Self::Set> {
38        Some(self.compose(a, &self.inverse(b)))
39    }
40}
41
42impl IdentitySignature for C2CanonicalStructure {
43    fn identity(&self) -> Self::Set {
44        C2::Identity
45    }
46}
47
48impl MonoidSignature for C2CanonicalStructure {}
49
50impl TryLeftInverseSignature for C2CanonicalStructure {
51    fn try_left_inverse(&self, a: &Self::Set) -> Option<Self::Set> {
52        Some(self.inverse(a))
53    }
54}
55
56impl TryRightInverseSignature for C2CanonicalStructure {
57    fn try_right_inverse(&self, a: &Self::Set) -> Option<Self::Set> {
58        Some(self.inverse(a))
59    }
60}
61
62impl TryInverseSignature for C2CanonicalStructure {
63    fn try_inverse(&self, a: &Self::Set) -> Option<Self::Set> {
64        Some(self.inverse(a))
65    }
66}
67
68impl GroupSignature for C2CanonicalStructure {
69    fn inverse(&self, a: &Self::Set) -> Self::Set {
70        *a
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77    use crate::structure::{MetaCompositionSignature, MetaGroupSignature, MetaIdentitySignature};
78
79    #[test]
80    fn test_c2() {
81        debug_assert_eq!(C2::identity(), C2::Identity);
82        debug_assert_eq!(C2::Identity.inverse(), C2::Identity);
83        debug_assert_eq!(C2::Flip.inverse(), C2::Flip);
84        debug_assert_eq!(C2::compose(&C2::Identity, &C2::Identity), C2::Identity);
85        debug_assert_eq!(C2::compose(&C2::Flip, &C2::Identity), C2::Flip);
86        debug_assert_eq!(C2::compose(&C2::Identity, &C2::Flip), C2::Flip);
87        debug_assert_eq!(C2::compose(&C2::Flip, &C2::Flip), C2::Identity);
88    }
89}