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
use crate::{Operator, TickValue, Tickable};

/// [`Map`] operator for [`map_t`].
#[derive(Debug, Clone, Copy)]
pub struct Map<F> {
    pub(super) f: F,
}

/// Create a [`Map`] ticked operator.
pub fn map_t<F>(f: F) -> Map<F> {
    Map { f }
}

impl<I, O, F> Operator<I> for Map<F>
where
    I: Tickable,
    F: FnMut(<I as Tickable>::Value) -> O,
{
    type Output = TickValue<O>;

    fn next(&mut self, input: I) -> Self::Output {
        let TickValue { tick, value } = input.into_tick_value();

        TickValue {
            tick,
            value: (self.f)(value),
        }
    }
}