more_itertools/grouping/
divide.rs1use std::rc::Rc;
2
3use crate::error;
4use crate::error::Error;
5use crate::itertools::accumulate::accumulate;
6use crate::sequence::Sequence;
7use crate::utils::extract_value_from_result_vec;
8
9
10#[allow(dead_code)]
11pub(crate) struct DivideInner<T> {
12 buf: Box<dyn Sequence<T>>,
13 pub(crate) n: usize,
14 len_vec: Vec<usize>,
15 accumulate_overflow: bool
16}
17
18pub struct Divide<T> {
19 pub(crate) inner: Rc<DivideInner<T>>
20}
21
22impl<T> Divide<T>
23where
24T: Clone + 'static
25{
26 pub fn new(buf: Box<dyn Sequence<T>>, bucket_count: usize) -> Divide<T> {
27 let mut _len_vec = Vec::new();
28 let base = buf.len() / bucket_count;
29 let _mod = buf.len() % bucket_count;
30
31 for _ in 0..bucket_count {
32 _len_vec.push(base);
33 }
34 for i in 0.._mod {
35 _len_vec[i] = _len_vec[i] + 1;
36 }
37
38
39 let mut accumulate_overflow = false;
40 let a = accumulate(_len_vec);
41 let mut _len_vec3 = extract_value_from_result_vec(a.collect::<Vec<_>>());
42 println!("{:?}", _len_vec3);
43 if _len_vec3.1.is_some() {
44 accumulate_overflow = true;
45 }
46
47 let mut _len_vec2 = Vec::new();
48 _len_vec2.push(0 as usize);
49 _len_vec2.append(&mut _len_vec3.0);
50
51
52 let inner = DivideInner {
53 buf: buf,
54 n: bucket_count,
55 len_vec: _len_vec2,
56 accumulate_overflow: accumulate_overflow
57 };
58
59 let ret = Divide {
60 inner: Rc::new(inner)
61 };
62
63 return ret;
64 }
65
66 pub fn iter_cnt(&self) -> usize {
67 return self.inner.n;
68 }
69
70 pub fn iter(&self, bucket_no: usize) -> Box<dyn Iterator<Item = Result<T, Error>>> {
71 assert!(bucket_no < self.inner.len_vec.len() - 1);
72 let start = self.inner.len_vec[bucket_no];
73 let end = self.inner.len_vec[bucket_no+1];
74
75 let ret: Box<dyn Iterator<Item = Result<T, Error>>> = Box::new(Cursor {
76 inner: Rc::clone(&self.inner),
77 cur: start,
78 end: end,
79 bucket_count: self.inner.n,
80 accumulate_overflow: self.inner.accumulate_overflow
81 });
82
83 return ret;
84 }
85}
86
87pub fn divide<T>(buf: Box<dyn Sequence<T>>, bucket_cnt: usize) -> Divide<T>
88where
89T: Clone + 'static
90{
91 return Divide::new(buf, bucket_cnt);
92}
93
94pub struct Cursor<T>
95{
96 inner: Rc<DivideInner<T>>,
97 cur: usize,
98 end: usize,
99 bucket_count: usize,
100 accumulate_overflow: bool
101}
102
103impl<T> Iterator for Cursor<T>
104where
105T: Clone
106{
107 type Item = Result<T, Error>;
108
109 fn next(&mut self) -> Option<Self::Item> {
110 if self.bucket_count == 0 {
111 return Some(Err(error::value_error("bucket count should not be 0".to_string())));
112 }
113
114 if self.accumulate_overflow {
115 return Some(Err(error::value_error("accumulate overflow".to_string())));
116 }
117
118 if self.cur >= self.end {
119 return None;
120 }
121
122 let real_ret: Option<Result<_, _>> = Some(Ok(self.inner.buf.get(self.cur).unwrap().clone()));
123
124 self.cur += 1;
125
126 return real_ret;
127 }
128}
129
130impl<T> Drop for Cursor<T> {
131 fn drop(&mut self) {
132 println!("Cursor, refcnt={}", Rc::strong_count(&self.inner));
133 }
134}
135impl<T> Drop for Divide<T> {
136 fn drop(&mut self) {
137 println!("Divide, refcnt={}", Rc::strong_count(&self.inner));
138 }
139}
140
141
142#[cfg(test)]
143mod tests {
144 use crate::sequence::create_seq_from_vec;
145
146 use super::*;
147
148 #[test]
149 fn test1() {
150 let v = vec![1,2,3,4,5,6,7,8,9,10];
151 let seq = create_seq_from_vec(v);
152 let div = divide(seq, 3);
153
154 let mut cur_0 = div.iter(0);
155 assert_eq!(1, cur_0.next().unwrap().ok().unwrap());
156 assert_eq!(2, cur_0.next().unwrap().ok().unwrap());
157 assert_eq!(3, cur_0.next().unwrap().ok().unwrap());
158 assert_eq!(4, cur_0.next().unwrap().ok().unwrap());
159 assert_eq!(None, cur_0.next());
160
161
162 let mut cur_1 = div.iter(1);
163 assert_eq!(5, cur_1.next().unwrap().ok().unwrap());
164 assert_eq!(6, cur_1.next().unwrap().ok().unwrap());
165 assert_eq!(7, cur_1.next().unwrap().ok().unwrap());
166 assert_eq!(None, cur_0.next());
167
168 let mut cur_2 = div.iter(2);
169 assert_eq!(8, cur_2.next().unwrap().ok().unwrap());
170 assert_eq!(9, cur_2.next().unwrap().ok().unwrap());
171 assert_eq!(10, cur_2.next().unwrap().ok().unwrap());
172 assert_eq!(None, cur_2.next());
173 }
174
175 #[test]
176 fn test2() {
177 let v = create_seq_from_vec(vec![1,2,3,4,5,6,7,8,9,10]);
178 let div = divide(v, 3);
179
180 let mut cur_0 = div.iter(0);
181 println!("{:?}", cur_0.next());
182 }
183}