1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#![deny(warnings)]

use crate::types::{DateTime, Range, Grain, TimeSequence};

#[derive(Clone)]
pub struct Map<Seq, RangeMapper>(pub Seq, pub RangeMapper)
    where Seq: TimeSequence,
          RangeMapper: FnMut(Range)->Option<Range> + Clone;

impl<Seq, RangeMapper> TimeSequence for Map<Seq, RangeMapper>
    where Seq: TimeSequence,
  RangeMapper: FnMut(Range)->Option<Range> + Clone,

{
    fn _future_raw(&self, t0: &DateTime) -> Box<dyn Iterator<Item=Range> + '_> {
        let mut f = self.1.clone();
        Box::new(self.0._future_raw(t0).filter_map(move |x| f(x)))
    }

    fn _past_raw(&self, t0: &DateTime) -> Box<dyn Iterator<Item=Range> + '_> {
        let mut f = self.1.clone();
        Box::new(self.0._past_raw(t0).filter_map(move |x| f(x)))
    }
}


pub fn shift<Seq>(seq: Seq, grain: Grain, n: i32) -> impl TimeSequence
    where Seq: TimeSequence
{
    use crate::utils;
    Map(seq, move |x| Some(Range{
        start: utils::shift_datetime(x.start, grain, n),
        end: utils::shift_datetime(x.end, grain, n),
        grain: x.grain}))
}


pub fn step_by<Seq>(seq: Seq, n: usize) -> impl TimeSequence
    where Seq: TimeSequence
{
    let mut counter = 0;
    Map(seq, move |x| {
        counter += 1;
        if (counter - 1) % n == 0 {
            Some(x)
        } else {
            None
        }
    })
}