mathru/algebra/abstr/
monoid.rs

1//! Monoid
2use super::{
3    identity::Identity,
4    operator::{Addition, Multiplication, Operator},
5    semigroup::{Semigroup, SemigroupAdd, SemigroupMul},
6};
7
8/// A Monoid is a triple $(\mathbb{M}, \circ, e)$, composed by a set
9/// $\mathbb{M}$ and a binary inner operation $\circ$ and the element $e
10/// \in \mathbb{M}$
11///
12/// ```math
13/// \circ: \mathbb{M} \times \mathbb{M} \rightarrow \mathbb{M} , (x, y) \mapsto x \circ y
14/// ```
15/// 1. associativity <br>
16///    $\forall x, y, z \in \mathbb{M}$: $x \circ (y \circ z) = (x \circ y)
17///    \circ z$ 2. $e$ neutral element <br>
18///    $\forall x \in \mathbb{M}$: $x \circ e = e \circ x = x$
19pub trait Monoid<O: Operator>: Semigroup<O> + Identity<O> {}
20
21macro_rules! impl_monoid
22(
23    ($O:ty; $op: ident; $($T:ty),*) =>
24    {
25        $(
26            impl Monoid<$O> for $T
27            {
28            }
29        )*
30    }
31);
32
33impl_monoid!(Addition; add; u8, u16, u32, u64, u128, i8, i16, i32, i64, i128, f32, f64);
34impl_monoid!(Multiplication; mul; u8, u16, u32, u64, u128, i8, i16, i32, i64, i128, f32, f64);
35
36pub trait MonoidAdd: Monoid<Addition> + SemigroupAdd + Zero {}
37
38macro_rules! impl_monoidadd
39(
40    ($($T:ty),*) =>
41    {
42        $(
43            impl MonoidAdd for $T
44            {
45
46            }
47        )*
48    }
49);
50
51impl_monoidadd!(u8, u16, u32, u64, u128, i8, i16, i32, i64, i128, f32, f64);
52
53pub trait MonoidMul: Monoid<Multiplication> + SemigroupMul + One {}
54
55macro_rules! impl_monoidmul
56(
57    ($($T:ty),*) =>
58    {
59        $(
60            impl MonoidMul for $T
61            {
62
63            }
64        )*
65    }
66);
67
68impl_monoidmul!(u8, u16, u32, u64, u128, i8, i16, i32, i64, i128, f32, f64);
69
70pub trait One {
71    fn one() -> Self;
72}
73
74macro_rules! impl_one
75{
76    ($v:expr; $($t:ty),+) =>
77    {
78    	$(
79        impl One for $t
80        {
81            fn one() -> Self
82            {
83                return $v;
84            }
85        }
86        )*
87    };
88}
89
90impl_one!(1; u8, u16, u32, u64, u128, i8, i16, i32, i64, i128);
91impl_one!(1.0; f32, f64);
92
93pub trait Zero {
94    fn zero() -> Self;
95}
96
97macro_rules! impl_zero
98{
99    ($v:expr; $($t:ty),*) =>
100    {
101    	$(
102        impl Zero for $t
103        {
104            fn zero() -> Self
105            {
106                return $v;
107            }
108        }
109        )*
110    };
111}
112
113impl_zero!(0; u8, u16, u32, u64, u128, i8, i16, i32, i64, i128);
114impl_zero!(0.0; f32, f64);