1use std::iter::once;
4
5pub trait CumSum: Iterator {
7 fn cumsum<St, F>(self, init: St, mut f: F) -> impl Iterator<Item = St>
9 where
10 Self: Sized,
11 St: Copy,
12 F: FnMut(&mut St, Self::Item),
13 {
14 once(init).chain(self.scan(init, move |acc, x| {
15 f(acc, x);
16 Some(*acc)
17 }))
18 }
19}
20
21impl<I> CumSum for I where I: Iterator + ?Sized {}
22
23#[cfg(test)]
24mod tests {
25 use super::*;
26
27 #[test]
28 fn test() {
29 let a = [1, 2, 3, 4, 5];
30 let b = a.iter().cumsum(0, |acc, x| *acc += x).collect::<Vec<_>>();
31
32 assert_eq!(b, vec![0, 1, 3, 6, 10, 15]);
33 }
34}