glissade/animation/
keyframes_map.rs

1use crate::{Keyframes, Time};
2use std::marker::PhantomData;
3
4pub struct MapKeyframes<T, R, X, K, F>
5where
6    X: Time,
7    K: Keyframes<T, X>,
8    F: Fn(T) -> R,
9{
10    keyframes: K,
11    map: F,
12    phantom_data: PhantomData<(T, R, X)>,
13}
14
15impl<T, R, X, K, F> MapKeyframes<T, R, X, K, F>
16where
17    X: Time,
18    K: Keyframes<T, X>,
19    F: Fn(T) -> R,
20{
21    pub fn new(keyframes: K, map: F) -> Self {
22        Self {
23            keyframes,
24            map,
25            phantom_data: Default::default(),
26        }
27    }
28}
29
30impl<T, R, X, K, F> Keyframes<R, X> for MapKeyframes<T, R, X, K, F>
31where
32    X: Time,
33    K: Keyframes<T, X>,
34    F: Fn(T) -> R,
35{
36    fn get(&self, offset: X::Duration) -> R {
37        (self.map)(self.keyframes.get(offset))
38    }
39
40    fn duration(&self) -> X::Duration {
41        self.keyframes.duration()
42    }
43
44    fn is_finite(&self) -> bool {
45        self.keyframes.is_finite()
46    }
47}