yui_core/abst/
add_mon.rs

1use std::ops::{Add, AddAssign};
2use num_traits::Zero;
3use crate::Elem;
4
5// Additive Monoids 
6pub trait AddMonOps<T = Self>: 
7    Sized + 
8    Add<T, Output = T> +              // S + T -> T
9    for<'a> Add<&'a T, Output = T>    // S + &T -> T
10{}
11
12pub trait AddMon: 
13    Elem + 
14    Zero +
15    AddMonOps +                       // T + T -> T, T + &T -> T
16    AddAssign +                       // T += T
17    for<'a> AddAssign<&'a Self>       // T += &T
18where 
19    for<'a> &'a Self: AddMonOps<Self> // &T + T -> T, &T + &T -> T
20{
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}