use std::ops::{Add, AddAssign};
use num_traits::Zero;
use crate::abst::MathType;
pub trait AddMonOps<T = Self>:
Sized +
Add<T, Output = T> + for<'a> Add<&'a T, Output = T> {}
pub trait AddMon:
MathType +
Zero +
AddMonOps + AddAssign + for<'a> AddAssign<&'a Self> where
for<'a> &'a Self: AddMonOps<Self> {
fn sum<A, I>(itr: I) -> Self
where
Self: AddAssign<A>,
I: IntoIterator<Item = A>
{
itr.into_iter().fold(Self::zero(), |mut res, a| {
res += a;
res
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sum() {
let a = i64::sum([4,5,6]);
assert_eq!(a, 15);
}
}