use crate::math::{AdvancedEasing, Easing};
impl AdvancedEasing {
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 {
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()),
}
}
}