1use crate::error;
2use crate::error::Error;
3use std::collections::{HashMap, VecDeque};
4use std::hash::Hash;
5
6pub fn extract_value_from_result_vec<T>(vec: Vec<Result<T, Error>>) -> (Vec<T>, Option<Error>) {
7 let mut ret_vec = Vec::new();
8 for v in vec.into_iter() {
9 match v {
10 Err(err2) => { return (ret_vec, Some(err2)); },
11 Ok(v2) => { ret_vec.push(v2); }
12 }
13 }
14 return (ret_vec, None);
15}
16
17pub fn join_string_vec(v: &Vec<char>) -> String{
18 return v.iter().collect();
19}
20
21pub fn join_char_vec_second_level(l: &Vec<Vec<char>>) -> Vec<String> {
22 let mut ret = vec![];
23 for item in l {
24 ret.push(join_string_vec(item));
25 }
26 return ret;
27}
28
29pub fn any(v: &Vec<bool>) -> bool {
30 for i in v.iter() {
31 if *i {
32 return true;
33 }
34 }
35 return false;
36}
37
38pub fn any1(v: Vec<bool>) -> Result<bool,Error> {
39 for i in v.iter() {
40 if *i {
41 return Ok(true);
42 }
43 }
44 return Ok(false);
45}
46
47
48
49pub fn any_result2(v: Vec<Result<bool, Error>>) -> Result<bool, Error> {
57 for i in v.iter() {
58 if i.is_ok() {
59 if *i.as_ref().unwrap() {
60 return Ok(true);
61 }
62 } else {
63 return i.clone();
64 }
65 }
66 return Ok(false);
67}
68
69
70
71pub fn are_same<T>(op1: Option<&T> , op2: Option<&T>) -> bool
72where T: PartialEq
73{
74 match (op1, op2) {
75 (None, None) => { return true; },
76 (Some(v1), Some(v2)) => { return *v1 == *v2; },
77 _ => { return false; }
78 }
79}
80
81pub fn argsort<T: Ord>(data: &[T]) -> Vec<usize> {
82 let mut indices = (0..data.len()).collect::<Vec<_>>();
83 indices.sort_by_key(|&i| &data[i]);
84 return indices;
85}
86
87
88pub fn counter<T>(hm: &mut HashMap<T, usize>, mut iter: Box<dyn Iterator<Item = Result<T,Error>>>) -> Result<(), Error>
89where T: Hash + Eq + PartialEq
90{
91 loop {
92 let _next = iter.next();
93
94 if let Some(res) = _next {
95 match res {
96 Ok(key) => {
97 let value = hm.get_mut(&key);
98 let add_res;
99 if value.is_none() {
100 add_res = (1, false);
101 } else {
102 add_res = usize::overflowing_add(*value.unwrap(), 1);
103 }
104
105 if add_res.1 {
106 return Err(error::overflow_error("[counter] overflow".to_string()));
107 } else {
108 hm.insert(key, add_res.0);
109 continue;
110 }
111 },
112 Err(err) => {
113 return Err(error::any_error(err.kind(), err.message().unwrap().clone()));
114 }
115 }
116 } else {
117 return Ok(());
118 }
119 }
120}
121
122struct Okok<T> {
123 ok_vec: Vec<T>,
124 cur: usize
125}
126
127impl<T> Iterator for Okok<T>
128where
129T: Clone + 'static
130{
131 type Item = Result<T, Error>;
132
133 fn next(&mut self) -> Option<Self::Item> {
134 if self.cur >= self.ok_vec.len() {
135 return None;
136 } else {
137 let ret = self.ok_vec.get(self.cur).unwrap().clone();
138 self.cur += 1;
139 return Some(Ok(ret));
140 }
141 }
142}
143
144pub fn generate_okok_iterator<T>(ok_vec: Vec<T>) -> Box<dyn Iterator<Item = Result<T, Error>>>
145where
146T: Clone + 'static
147{
148 return Box::new(Okok {
149 ok_vec,
150 cur: 0
151 });
152}
153
154struct Okokerr<T> {
155 ok_vec: Vec<T>,
156 err: Error,
157 cur: usize
158}
159
160impl<T> Iterator for Okokerr<T>
161where
162T: Clone + 'static
163{
164 type Item = Result<T, Error>;
165
166 fn next(&mut self) -> Option<Self::Item> {
167 if self.cur >= self.ok_vec.len() {
168 return Some(Err(error::any_error(self.err.kind(), self.err.message().unwrap().clone())));
169 } else {
170 let ret = self.ok_vec.get(self.cur).unwrap().clone();
171 self.cur += 1;
172 return Some(Ok(ret));
173 }
174 }
175}
176
177pub fn generate_okokerr_iterator<T>(ok_vec: Vec<T>, err: Error) -> Box<dyn Iterator<Item = Result<T, Error>>>
178where
179T: Clone + 'static
180{
181 return Box::new(Okokerr {
182 ok_vec,
183 err,
184 cur: 0
185 });
186}
187
188pub fn vecdeque_2_vec<T>(vd: &mut VecDeque<T>) -> Vec<T> {
189 let mut ret = Vec::<T>::new();
190 while vd.len() > 0 {
191 ret.push(vd.pop_front().unwrap());
192 }
193 return ret;
194}
195
196#[cfg(test)]
197mod tests {
198 use super::*;
199 use crate::error;
200
201 #[test]
202 fn test1() {
203 let v = vec![Ok(4),Ok(3),Ok(3)];
204 let a = extract_value_from_result_vec(v);
205 assert!(a.1.is_none());
206 assert_eq!(vec![4,3,3], a.0);
207
208 let v = vec![Ok(4),Err(error::any_error(error::Kind::OverflowError, "Overflow".to_string())),Ok(3)];
209 let a = extract_value_from_result_vec(v);
210 assert!(a.1.is_some());
211 assert_eq!(vec![4], a.0);
212 }
213
214 #[test]
215 fn test2() {
216 let v = vec!['a', 'b', 'c'];
217 assert_eq!(join_string_vec(&v), "abc".to_string());
218 }
219
220 #[test]
221 fn test_any() {
222 let v = vec![true,true];
223 assert_eq!(true, any(&v));
224
225 let v = vec![true,false];
226 assert_eq!(true, any(&v));
227
228 let v: Vec<bool> = vec![false,false];
229 assert_eq!(false, any(&v));
230
231 }
232
233 #[test]
234 fn test_are_same() {
235 assert!(are_same(None::<&i32>, None));
236 assert!(!are_same(None, Some(&1)));
237 assert!(!are_same(Some(&1), None));
238 assert!(are_same(Some(&1), Some(&1)));
239 assert!(!are_same(Some(&2), Some(&1)));
240 }
241
242 #[test]
243 fn test_argsort() {
244 let v = [3,1,2,4];
245 let ret = argsort(v.as_slice());
246 assert_eq!(vec![1usize,2usize,0usize,3usize], ret);
247 }
248
249 #[test]
250 fn test_counter() {
251 let v = vec![5,1,2,2,3,3,3,4,4,4,4,5,5,5,5];
252 let mut hm = HashMap::new();
253 let _ = counter(&mut hm, generate_okok_iterator(v));
254 assert_eq!(&1, hm.get(&1).unwrap());
255 assert_eq!(&2, hm.get(&2).unwrap());
256 assert_eq!(&3, hm.get(&3).unwrap());
257 assert_eq!(&4, hm.get(&4).unwrap());
258 assert_eq!(&5, hm.get(&5).unwrap());
259 }
260
261 #[test]
262 fn test_vecdeque_2_vec() {
263 let mut vd = VecDeque::new();
264 vd.push_back(1i32);
265 vd.push_back(2i32);
266 vd.push_back(3i32);
267
268 assert_eq!(vec![1,2,3], vecdeque_2_vec(&mut vd));
269 }
270}