1use std::ops::{Mul, MulAssign};
2use num_traits::One;
3use crate::Elem;
4
5pub 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}