///|
fn square(value : Double) -> Double {
  value * value
}

///|
fn cube(value : Double) -> Double {
  value * value * value
}

///|
fn power(value : Double, exponent : Double) -> Double {
  @math.pow(value, exponent)
}

///|
fn ease_in_power(t : Double, exponent : Double) -> Double {
  power(t, exponent)
}

///|
fn ease_out_power(t : Double, exponent : Double) -> Double {
  1.0 - power(1.0 - t, exponent)
}

///|
fn ease_in_out_power(t : Double, exponent : Double) -> Double {
  let doubled = t * 2.0
  if doubled < 1.0 {
    power(doubled, exponent) / 2.0
  } else {
    (2.0 - power(2.0 - doubled, exponent)) / 2.0
  }
}

///|
fn ease_sine_in(t : Double) -> Double {
  if t <= 0.0 {
    0.0
  } else if t >= 1.0 {
    1.0
  } else {
    1.0 - @math.cos(t * @math.PI / 2.0)
  }
}

///|
fn ease_sine_out(t : Double) -> Double {
  if t <= 0.0 {
    0.0
  } else if t >= 1.0 {
    1.0
  } else {
    @math.sin(t * @math.PI / 2.0)
  }
}

///|
fn ease_sine_in_out(t : Double) -> Double {
  if t <= 0.0 {
    0.0
  } else if t >= 1.0 {
    1.0
  } else {
    (1.0 - @math.cos(t * @math.PI)) / 2.0
  }
}