mathru/algebra/abstr/
monoid.rs1use super::{
3 identity::Identity,
4 operator::{Addition, Multiplication, Operator},
5 semigroup::{Semigroup, SemigroupAdd, SemigroupMul},
6};
7
8pub 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);