glissade 0.2.10

Rust library that provides various utilities for animations and transitions
Documentation
use crate::{Keyframes, Time};
use std::marker::PhantomData;

pub struct MapKeyframes<T, R, X, K, F>
where
    X: Time,
    K: Keyframes<T, X>,
    F: Fn(T) -> R,
{
    keyframes: K,
    map: F,
    phantom_data: PhantomData<(T, R, X)>,
}

impl<T, R, X, K, F> MapKeyframes<T, R, X, K, F>
where
    X: Time,
    K: Keyframes<T, X>,
    F: Fn(T) -> R,
{
    pub fn new(keyframes: K, map: F) -> Self {
        Self {
            keyframes,
            map,
            phantom_data: Default::default(),
        }
    }
}

impl<T, R, X, K, F> Keyframes<R, X> for MapKeyframes<T, R, X, K, F>
where
    X: Time,
    K: Keyframes<T, X>,
    F: Fn(T) -> R,
{
    fn get(&self, offset: X::Duration) -> R {
        (self.map)(self.keyframes.get(offset))
    }

    fn duration(&self) -> X::Duration {
        self.keyframes.duration()
    }

    fn is_finite(&self) -> bool {
        self.keyframes.is_finite()
    }
}