
PI :: 3.1415926;
TAU :: 6.2831853;

#if #exists(UNITS) #if UNITS == {
   case .turns;
      to_rad   :: turn_to_rad;
      from_rad :: rad_to_turn;
   case .radians;
      to_rad   :: rad_to_rad;
      from_rad :: rad_to_rad;
   case .degrees;
      to_rad :: deg_to_rad;
      from_rad :: rad_to_deg;
}
else {
   to_rad   :: turn_to_rad;
   from_rad :: rad_to_turn;
}

turn_to_rad :: (turns: float64) -> float #expand #no_debug {
   CONSTANT :float64: PI*2.0;
   return cast(float)(CONSTANT*turns);
}
turn_to_rad :: (turns: float) -> float #expand #no_debug {
   CONSTANT :float: xx PI*2.0;
   return CONSTANT*turns;
}

deg_to_rad :: (deg: float64) -> float #expand #no_debug {
   CONSTANT :float64: PI/180.0;
   return cast(float)(CONSTANT*deg);
}
deg_to_rad :: (deg: float) -> float #expand #no_debug {
   CONSTANT :float: xx (PI/180.0);
   return CONSTANT*deg;
}

rad_to_rad :: (rad: float64) -> float #expand #no_debug {
   return cast(float)rad;
}
rad_to_rad :: (rad: float) -> float #expand #no_debug {
   return rad;
}

rad_to_turn :: (rad: float64) -> float #expand {
   CONSTANT :float64: (1.0/(PI*2.0));
   return cast(float)(CONSTANT*rad);
}
rad_to_turn :: (rad: float) -> float #expand {
   CONSTANT :float: xx (1.0/(PI*2.0));
   return CONSTANT*rad;
}

rad_to_deg :: (rad: float64) -> float #expand {
   CONSTANT :float64: (180.0/PI);
   return cast(float)(CONSTANT*rad);
}
rad_to_deg :: (rad: float) -> float #expand {
   CONSTANT :float: xx (180.0/PI);
   return CONSTANT*rad;
}

sin :: (ang: float) -> float #expand {
   return math.sin(to_rad(ang));
}

cos :: (ang: float) -> float #expand {
   return math.cos(to_rad(ang));
}

atan2 :: (y: float, x: float) -> float #expand {
   return from_rad(math.atan2(y, x));
}

asin :: (ang: float) -> float #expand {
   return from_rad(math.asin(ang));
}

max :: (x: float, y: float) -> float {
   if x < y return y;
   return x;
}

min :: (x: float, y: float) -> float {
   if x < y return x;
   return y;
}

abs :: (v: $T) -> T
#modify { return TypeIsScalar(T), "Only accepting scalar types, integer and float"; } {
   return ifx v < 0 then -v else v;
}

sign :: (x: int) -> int {
   if x < 0
      return -1;
   else if x > 0
      return 1;
   return 0;
}

sign :: (x: float) -> float {
   if x < 0.0
      return -1.0;
   else if x > 0.0
      return 1.0;
   return 0.0;
}

#scope_file

#import "jc";
// sin, cos
math :: #import "Math";
