glissade/animation/
keyframes_map.rs1use 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}