vsrg 0.3.0

Data structures for vertical scrolling rhythm games
Documentation
use crate::math::{AdvancedEasing, Easing};

impl AdvancedEasing {
    /// Constructs an equivalent [`MonotonicEasing`] if this easing is monotonic.
    pub fn to_monotonic(self) -> Option<Easing> {
        match self {
            AdvancedEasing::Linear => Some(Easing::Linear),
            AdvancedEasing::InConst => Some(Easing::InConst),
            AdvancedEasing::OutConst => Some(Easing::OutConst),
            AdvancedEasing::InOutConst => Some(Easing::InOutConst),
            AdvancedEasing::InSine => Some(Easing::InSine),
            AdvancedEasing::OutSine => Some(Easing::OutSine),
            AdvancedEasing::InOutSine => Some(Easing::InOutSine),
            AdvancedEasing::InQuad => Some(Easing::InQuad),
            AdvancedEasing::OutQuad => Some(Easing::OutQuad),
            AdvancedEasing::InOutQuad => Some(Easing::InOutQuad),
            AdvancedEasing::InCubic => Some(Easing::InCubic),
            AdvancedEasing::OutCubic => Some(Easing::OutCubic),
            AdvancedEasing::InOutCubic => Some(Easing::InOutCubic),
            AdvancedEasing::InQuart => Some(Easing::InQuart),
            AdvancedEasing::OutQuart => Some(Easing::OutQuart),
            AdvancedEasing::InOutQuart => Some(Easing::InOutQuart),
            AdvancedEasing::InQuint => Some(Easing::InQuint),
            AdvancedEasing::OutQuint => Some(Easing::OutQuint),
            AdvancedEasing::InOutQuint => Some(Easing::InOutQuint),
            AdvancedEasing::InExpo => Some(Easing::InExpo),
            AdvancedEasing::OutExpo => Some(Easing::OutExpo),
            AdvancedEasing::InOutExpo => Some(Easing::InOutExpo),
            _ => None,
        }
    }

    pub fn cycle_next(self) -> Self {
        match self {
            AdvancedEasing::Linear => AdvancedEasing::InConst,
            AdvancedEasing::InConst => AdvancedEasing::OutConst,
            AdvancedEasing::OutConst => AdvancedEasing::InOutConst,
            AdvancedEasing::InOutConst => AdvancedEasing::InSine,
            AdvancedEasing::InSine => AdvancedEasing::OutSine,
            AdvancedEasing::OutSine => AdvancedEasing::InOutSine,
            AdvancedEasing::InOutSine => AdvancedEasing::InQuad,
            AdvancedEasing::InQuad => AdvancedEasing::OutQuad,
            AdvancedEasing::OutQuad => AdvancedEasing::InOutQuad,
            AdvancedEasing::InOutQuad => AdvancedEasing::InCubic,
            AdvancedEasing::InCubic => AdvancedEasing::OutCubic,
            AdvancedEasing::OutCubic => AdvancedEasing::InOutCubic,
            AdvancedEasing::InOutCubic => AdvancedEasing::InQuart,
            AdvancedEasing::InQuart => AdvancedEasing::OutQuart,
            AdvancedEasing::OutQuart => AdvancedEasing::InOutQuart,
            AdvancedEasing::InOutQuart => AdvancedEasing::InQuint,
            AdvancedEasing::InQuint => AdvancedEasing::OutQuint,
            AdvancedEasing::OutQuint => AdvancedEasing::InOutQuint,
            AdvancedEasing::InOutQuint => AdvancedEasing::InExpo,
            AdvancedEasing::InExpo => AdvancedEasing::OutExpo,
            AdvancedEasing::OutExpo => AdvancedEasing::InOutExpo,
            AdvancedEasing::InOutExpo => AdvancedEasing::InCirc,
            AdvancedEasing::InCirc => AdvancedEasing::OutCirc,
            AdvancedEasing::OutCirc => AdvancedEasing::InOutCirc,
            AdvancedEasing::InOutCirc => AdvancedEasing::InBack,
            AdvancedEasing::InBack => AdvancedEasing::OutBack,
            AdvancedEasing::OutBack => AdvancedEasing::InOutBack,
            AdvancedEasing::InOutBack => AdvancedEasing::InElastic,
            AdvancedEasing::InElastic => AdvancedEasing::OutElastic,
            AdvancedEasing::OutElastic => AdvancedEasing::InOutElastic,
            AdvancedEasing::InOutElastic => AdvancedEasing::InBounce,
            AdvancedEasing::InBounce => AdvancedEasing::OutBounce,
            AdvancedEasing::OutBounce => AdvancedEasing::InOutBounce,
            AdvancedEasing::InOutBounce => AdvancedEasing::Linear,
        }
    }

    pub fn cycle_prev(self) -> Self {
        match self {
            AdvancedEasing::Linear => AdvancedEasing::InOutBounce,
            AdvancedEasing::InConst => AdvancedEasing::Linear,
            AdvancedEasing::OutConst => AdvancedEasing::InConst,
            AdvancedEasing::InOutConst => AdvancedEasing::OutConst,
            AdvancedEasing::InSine => AdvancedEasing::InOutConst,
            AdvancedEasing::OutSine => AdvancedEasing::InSine,
            AdvancedEasing::InOutSine => AdvancedEasing::OutSine,
            AdvancedEasing::InQuad => AdvancedEasing::InOutSine,
            AdvancedEasing::OutQuad => AdvancedEasing::InQuad,
            AdvancedEasing::InOutQuad => AdvancedEasing::OutQuad,
            AdvancedEasing::InCubic => AdvancedEasing::InOutQuad,
            AdvancedEasing::OutCubic => AdvancedEasing::InCubic,
            AdvancedEasing::InOutCubic => AdvancedEasing::OutCubic,
            AdvancedEasing::InQuart => AdvancedEasing::InOutCubic,
            AdvancedEasing::OutQuart => AdvancedEasing::InQuart,
            AdvancedEasing::InOutQuart => AdvancedEasing::OutQuart,
            AdvancedEasing::InQuint => AdvancedEasing::InOutQuart,
            AdvancedEasing::OutQuint => AdvancedEasing::InQuint,
            AdvancedEasing::InOutQuint => AdvancedEasing::OutQuint,
            AdvancedEasing::InExpo => AdvancedEasing::InOutQuint,
            AdvancedEasing::OutExpo => AdvancedEasing::InExpo,
            AdvancedEasing::InOutExpo => AdvancedEasing::OutExpo,
            AdvancedEasing::InCirc => AdvancedEasing::InOutExpo,
            AdvancedEasing::OutCirc => AdvancedEasing::InCirc,
            AdvancedEasing::InOutCirc => AdvancedEasing::OutCirc,
            AdvancedEasing::InBack => AdvancedEasing::InOutCirc,
            AdvancedEasing::OutBack => AdvancedEasing::InBack,
            AdvancedEasing::InOutBack => AdvancedEasing::OutBack,
            AdvancedEasing::InElastic => AdvancedEasing::InOutBack,
            AdvancedEasing::OutElastic => AdvancedEasing::InElastic,
            AdvancedEasing::InOutElastic => AdvancedEasing::OutElastic,
            AdvancedEasing::InBounce => AdvancedEasing::InOutElastic,
            AdvancedEasing::OutBounce => AdvancedEasing::InBounce,
            AdvancedEasing::InOutBounce => AdvancedEasing::OutBounce,
        }
    }

    pub fn next(self) -> Option<Self> {
        match self {
            AdvancedEasing::InOutBounce => None,
            x => Some(x.cycle_next()),
        }
    }

    pub fn prev(self) -> Option<Self> {
        match self {
            AdvancedEasing::Linear => None,
            x => Some(x.cycle_prev()),
        }
    }
}

impl Easing {
    /// Converts to an equivalent [`Easing`].
    pub fn as_easing(self) -> AdvancedEasing {
        match self {
            Easing::Linear => AdvancedEasing::Linear,
            Easing::InConst => AdvancedEasing::InConst,
            Easing::OutConst => AdvancedEasing::OutConst,
            Easing::InOutConst => AdvancedEasing::InOutConst,
            Easing::InSine => AdvancedEasing::InSine,
            Easing::OutSine => AdvancedEasing::OutSine,
            Easing::InOutSine => AdvancedEasing::InOutSine,
            Easing::InQuad => AdvancedEasing::InQuad,
            Easing::OutQuad => AdvancedEasing::OutQuad,
            Easing::InOutQuad => AdvancedEasing::InOutQuad,
            Easing::InCubic => AdvancedEasing::InCubic,
            Easing::OutCubic => AdvancedEasing::OutCubic,
            Easing::InOutCubic => AdvancedEasing::InOutCubic,
            Easing::InQuart => AdvancedEasing::InQuart,
            Easing::OutQuart => AdvancedEasing::OutQuart,
            Easing::InOutQuart => AdvancedEasing::InOutQuart,
            Easing::InQuint => AdvancedEasing::InQuint,
            Easing::OutQuint => AdvancedEasing::OutQuint,
            Easing::InOutQuint => AdvancedEasing::InOutQuint,
            Easing::InExpo => AdvancedEasing::InExpo,
            Easing::OutExpo => AdvancedEasing::OutExpo,
            Easing::InOutExpo => AdvancedEasing::InOutExpo,
        }
    }

    pub fn cycle_next(self) -> Self {
        match self {
            Easing::Linear => Easing::InConst,
            Easing::InConst => Easing::OutConst,
            Easing::OutConst => Easing::InOutConst,
            Easing::InOutConst => Easing::InSine,
            Easing::InSine => Easing::OutSine,
            Easing::OutSine => Easing::InOutSine,
            Easing::InOutSine => Easing::InQuad,
            Easing::InQuad => Easing::OutQuad,
            Easing::OutQuad => Easing::InOutQuad,
            Easing::InOutQuad => Easing::InCubic,
            Easing::InCubic => Easing::OutCubic,
            Easing::OutCubic => Easing::InOutCubic,
            Easing::InOutCubic => Easing::InQuart,
            Easing::InQuart => Easing::OutQuart,
            Easing::OutQuart => Easing::InOutQuart,
            Easing::InOutQuart => Easing::InQuint,
            Easing::InQuint => Easing::OutQuint,
            Easing::OutQuint => Easing::InOutQuint,
            Easing::InOutQuint => Easing::InExpo,
            Easing::InExpo => Easing::OutExpo,
            Easing::OutExpo => Easing::InOutExpo,
            Easing::InOutExpo => Easing::Linear,
        }
    }

    pub fn cycle_prev(self) -> Self {
        match self {
            Easing::Linear => Easing::InOutExpo,
            Easing::InConst => Easing::Linear,
            Easing::OutConst => Easing::InConst,
            Easing::InOutConst => Easing::OutConst,
            Easing::InSine => Easing::InOutConst,
            Easing::OutSine => Easing::InSine,
            Easing::InOutSine => Easing::OutSine,
            Easing::InQuad => Easing::InOutSine,
            Easing::OutQuad => Easing::InQuad,
            Easing::InOutQuad => Easing::OutQuad,
            Easing::InCubic => Easing::InOutQuad,
            Easing::OutCubic => Easing::InCubic,
            Easing::InOutCubic => Easing::OutCubic,
            Easing::InQuart => Easing::InOutCubic,
            Easing::OutQuart => Easing::InQuart,
            Easing::InOutQuart => Easing::OutQuart,
            Easing::InQuint => Easing::InOutQuart,
            Easing::OutQuint => Easing::InQuint,
            Easing::InOutQuint => Easing::OutQuint,
            Easing::InExpo => Easing::InOutQuint,
            Easing::OutExpo => Easing::InExpo,
            Easing::InOutExpo => Easing::OutExpo,
        }
    }

    pub fn next(self) -> Option<Self> {
        match self {
            Easing::InOutExpo => None,
            x => Some(x.cycle_next()),
        }
    }

    pub fn prev(self) -> Option<Self> {
        match self {
            Easing::Linear => None,
            x => Some(x.cycle_prev()),
        }
    }
}