algebraeon_groups/examples/
c2.rs1use 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}