rust_fp_categories/
monoid.rs

1use 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}