rust_fp_categories/
monoid.rs1use crate::{Empty, Semigroup};
2
3pub trait Monoid: Empty + Semigroup {}
4
5macro_rules! monoid_numeric_impl {
6 ($($t:ty)*) => ($(
7 impl Monoid for $t {}
8 )*)
9}
10
11monoid_numeric_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 }
12
13impl<T: Clone> Monoid for Vec<T> {}
14impl Monoid for String {}
15
16#[cfg(test)]
17mod laws {
18 use crate::{Empty, Semigroup};
19
20 #[quickcheck]
21 fn monoid_left_identity(n: i32) {
22 assert_eq!(i32::empty().combine(n), n)
23 }
24
25 #[quickcheck]
26 fn monoid_right_identity(n: i32) {
27 assert_eq!(n.combine(i32::empty()), n)
28 }
29}