concat_monoid/
lib.rs

1use monoid::def_monoid_generics;
2
3def_monoid_generics! {
4    pub OpConcat[T, B] where [
5        T: Clone,
6        B: Clone + IntoIterator<Item = T> + FromIterator<T>,
7    ] = (
8        B,
9        |x: &B, y: &B| x.clone().into_iter().chain(y.clone()).collect(),
10        || None.into_iter().collect(),
11    ),
12}
13
14#[cfg(test)]
15mod tests {
16    use monoid::{BinaryOp, Identity};
17
18    use crate::*;
19
20    #[test]
21    fn sanity_check() {
22        let concat = OpConcat::<i32, Vec<_>>::new();
23        assert_eq!(concat.op(&vec![], &vec![]), vec![]);
24        assert_eq!(concat.op(&vec![], &vec![3, 4]), vec![3, 4]);
25        assert_eq!(concat.op(&vec![1, 2], &vec![]), vec![1, 2]);
26        assert_eq!(concat.op(&vec![1, 2], &vec![3, 4]), vec![1, 2, 3, 4]);
27        assert_eq!(concat.id(), vec![]);
28    }
29}