eazing 0.0.1

The blazingly fast and mathematically optimized `easing functions` kit.
Documentation
//! # The Circle Curve.

use crate::easing::Curve;

// #[cfg(feature = "libm")]
use libm::sqrtf;

/// ### The [`InCircle`] Easing Function.
///
/// #### examples.
///
/// ```rust
/// use eazing::Curve;
/// use eazing::trigonetric::circle::InCircle;
///
/// let p = InCircle.y(1.0);
/// ```
#[derive(Debug)]
pub struct InCircle;

impl Curve for InCircle {
  #[inline]
  fn y(&self, p: f32) -> f32 {
    1.0 - (1.0 - p * p)
  }
}

#[test]
fn test_in_circle() {
  let p = InCircle.y(0.5);

  assert_eq!(p, 0.29289323);
}

/// ### The [`OutCircle`] Easing Function.
///
/// #### examples.
///
/// ```rust
/// use eazing::Curve;
/// use eazing::trigonetric::circle::OutCircle;
///
/// let p = OutCircle.y(1.0);
/// ```
#[derive(Debug)]
pub struct OutCircle;

impl Curve for OutCircle {
  #[inline]
  fn y(&self, p: f32) -> f32 {
    let m = p - 1.0;

    sqrtf(1.0 - m * m)
  }
}

#[test]
fn test_out_circle() {
  let p = OutCircle.y(0.5);

  assert_eq!(p, 0.29289323);
}

/// ### The [`InOutCircle`] Easing Function.
///
/// #### examples.
///
/// ```rust
/// use eazing::Curve;
/// use eazing::trigonetric::circle::InOutCircle;
///
/// let p = InOutCircle.y(1.0);
/// ```
#[derive(Debug)]
pub struct InOutCircle;

impl Curve for InOutCircle {
  #[inline]
  fn y(&self, p: f32) -> f32 {
    let m = p - 1.0;
    let t = p * 2.0;

    if t < 1.0 {
      return (1.0 - sqrtf(1.0 - t * t)) * 0.5;
    }

    (sqrtf(1.0 - 4.0 * m * m) + 1.0) * 0.5
  }
}

#[test]
fn test_in_out_circle() {
  let p = InOutCircle.y(0.5);

  assert_eq!(p, 0.29289323);
}