yui_core/abst/
mon.rs

1use std::ops::{Mul, MulAssign};
2use num_traits::One;
3use crate::Elem;
4
5// Monoids (multiplicative)
6
7pub trait MonOps<T = Self>: 
8    Sized + 
9    Mul<T, Output = T> + 
10    for<'a> Mul<&'a T, Output = T> 
11{}
12
13pub trait Mon: 
14    Elem + 
15    One +
16    MonOps + 
17    MulAssign + 
18    for<'a> MulAssign<&'a Self>
19where
20    for<'a> &'a Self: MonOps<Self>
21{
22    fn product<A, I>(itr: I) -> Self 
23    where 
24        Self: MulAssign<A>,
25        I: IntoIterator<Item = A> 
26    { 
27        itr.into_iter().fold(Self::one(), |mut res, a| { 
28            res *= a;
29            res
30        })
31    }
32}
33
34#[cfg(test)]
35mod tests { 
36    use super::*;
37    #[test]
38    fn product() { 
39        let a = i64::product([4,5,6]);
40        assert_eq!(a, 120);
41    }
42}