Documentation
pub fn ease_in(p: f32, s: f32, c: f32, d: f32) -> f32 {
    c *
    (p / d) *
    (p / d) + s
}

pub fn ease_in_cubic(p: f32, s: f32, c: f32, d: f32) -> f32 {
    c *
    (p / d) *
    (p / d) *
    (p / d) + s
}

pub fn ease_in_quart(p: f32, s: f32, c: f32, d: f32) -> f32 {
    c *
    (p / d) *
    (p / d) *
    (p / d) * 
    (p / d) + s
}

pub fn ease_in_quint(p: f32, s: f32, c: f32, d: f32) -> f32 {
    c * 
    (p / d) *
    (p / d) *
    (p / d) *
    (p / d) *
    (p / d) + s
}


pub fn ease_out(p: f32, s: f32, c: f32, d: f32) -> f32 {
    -c * (p / d) * ((p / d) - 2.0f32) + s
}

pub fn ease_out_expo(p: f32, s: f32, c: f32, d: f32) -> f32 {
    if p == d {
        return s + c
    }
    let k: f32 = -2f32.powf(-10.0f32 * p / d) + 1.0f32;
    c * k + s
}

pub fn ease_out_cubic(p: f32, s: f32, c: f32, d: f32) -> f32 {
    c * (
        (p / d - 1.0f32) *
        (p / d - 1.0f32) *
        (p / d - 1.0f32) + 1.0f32
    ) + s
}

pub fn ease_out_quart(p: f32, s: f32, c: f32, d: f32) -> f32 {
    -c * (
        (p / d - 1.0f32) *
        (p / d - 1.0f32) *
        (p / d - 1.0f32) *
        (p / d - 1.0f32) - 1.0f32
    ) + s
}

pub fn ease_out_quint(p: f32, s: f32, c: f32, d: f32) -> f32 {
    c * (
        (p / d - 1.0f32) *
        (p / d - 1.0f32) *
        (p / d - 1.0f32) *
        (p / d - 1.0f32) *
        (p / d - 1.0f32) + 1.0f32
    ) + s
}