more_itertools/itertools/
accumulate.rs

1use crate::error::Error;
2use crate::error;
3
4pub struct Accumulate 
5{
6    cur_sum: usize,
7    cur_idx: usize,
8    v: Vec<usize>
9}
10
11impl Iterator for Accumulate
12{
13    type Item = Result<usize, Error>;
14
15    fn next(&mut self) -> Option<Self::Item> {
16        if self.cur_idx >= self.v.len() {
17            return None;
18        }
19
20        let ret = usize::overflowing_add(self.cur_sum, self.v[self.cur_idx]);
21        if ret.1 {
22            // overflow
23            return Some(Err(error::any_error(error::Kind::OverflowError, "Add overflow.".to_string())));
24        } else {
25            self.cur_idx += 1;
26            self.cur_sum = ret.0;
27            return Some(Ok(ret.0));
28        }
29    }
30}
31
32pub fn accumulate(v: Vec<usize>) -> Accumulate {
33    return Accumulate {
34        cur_sum: 0,
35        cur_idx: 0,
36        v: v
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use crate::utils::extract_value_from_result_vec;
43
44    use super::*;
45
46    #[test]
47    fn test1() {
48        let v = vec![4,3,3];
49
50        let a = accumulate(v);
51
52        assert_eq!((vec![4, 7, 10], None), extract_value_from_result_vec(a.collect::<Vec<_>>()));
53    }
54
55}