1use std::ops::{Add, AddAssign};
2use num_traits::Zero;
3use crate::Elem;
4
5pub trait AddMonOps<T = Self>:
7 Sized +
8 Add<T, Output = T> + for<'a> Add<&'a T, Output = T> {}
11
12pub trait AddMon:
13 Elem +
14 Zero +
15 AddMonOps + AddAssign + for<'a> AddAssign<&'a Self> where
19 for<'a> &'a Self: AddMonOps<Self> {
21 fn sum<A, I>(itr: I) -> Self
22 where
23 Self: AddAssign<A>,
24 I: IntoIterator<Item = A>
25 {
26 itr.into_iter().fold(Self::zero(), |mut res, a| {
27 res += a;
28 res
29 })
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36 #[test]
37 fn sum() {
38 let a = i64::sum([4,5,6]);
39 assert_eq!(a, 15);
40 }
41}