more_itertools/augmenting/
adjacent.rs1use crate::error::Error;
2use crate::itertools::{tee::tee, map::map, zip::zip};
3use crate::windowing::windowed::windowed;
4use crate::utils::{any1, generate_okok_iterator};
5
6use crate::itertools::chain::chain;
7
8fn false_padding(n: usize) -> Vec<bool> {
9 let mut padding = Vec::<bool>::new();
10 for _ in 0..n {
11 padding.push(false);
12 }
13 return padding;
14}
15
16pub fn adjacent<T>(i: Box<dyn Iterator<Item=Result<T,Error>>>,
17 pred: fn(T)->Result<bool,Error>, distance: usize) -> Box<dyn Iterator<Item = Result<(bool, T), Error>>>
18where
19T: Clone + 'static
20{
21 let (i1, i2) = tee(i);
22 let left_padding = generate_okok_iterator(false_padding(distance));
23 let right_padding = generate_okok_iterator(false_padding(distance));
24 let input = vec![left_padding, map(i1, pred), right_padding];
25
26 let selected = chain(input);
27
28
29 let adjacent_to_selected = map(windowed(selected, 2 * distance + 1, 1), any1);
30 let ret0 = zip(adjacent_to_selected, i2);
33
34 return ret0;
35}
36
37
38#[cfg(test)]
39mod tests {
40 use crate::utils::extract_value_from_result_vec;
41
42 use super::*;
43
44 #[test]
45 fn test1() {
46 let v = vec![1,2,3,4,5];
47 let adj = adjacent(generate_okok_iterator(v), |x| {Ok(x == 3)}, 1);
48 assert_eq!(vec![(false, 1), (true, 2), (true, 3), (true, 4), (false, 5)], extract_value_from_result_vec(adj.collect::<Vec<_>>()).0);
49
50 let v = vec![1,2,3,4,5];
51 let adj = adjacent(generate_okok_iterator(v), |x| {Ok(x == 1 || x == 5)}, 1);
52 assert_eq!(vec![(true, 1), (true, 2), (false, 3), (true, 4), (true, 5)], extract_value_from_result_vec(adj.collect::<Vec<_>>()).0);
53
54 let v = vec![1,2,3,4,5];
55 let adj = adjacent(generate_okok_iterator(v), |x| {Ok(x == 1 || x == 5)}, 2);
56 assert_eq!(vec![(true, 1), (true, 2), (true, 3), (true, 4), (true, 5)], extract_value_from_result_vec(adj.collect::<Vec<_>>()).0);
57
58 let v = vec![1,2,3,4,5];
59 let adj = adjacent(generate_okok_iterator(v), |x| {Ok(x == 1 || x == 5)}, 0);
60 assert_eq!(vec![(true, 1), (false, 2), (false, 3), (false, 4), (true, 5)], extract_value_from_result_vec(adj.collect::<Vec<_>>()).0);
61 }
62}