more_itertools/augmenting/
adjacent.rs

1use 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    // println!("adjacent_to_selected={:?}", adjacent_to_selected);
31
32    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}