more_itertools/itertools/
accumulate.rs1use 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 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}