private with Ada.Numerics;
generic
type Real is digits <>;
package WL.Numerics.Generic_Trigonometry is
subtype Signed_Unit_Real is Real range -1.0 .. 1.0;
type Angle is private;
Pi : constant Angle;
function "+" (X, Y : Angle) return Angle;
function "-" (X, Y : Angle) return Angle;
function "+" (X : Angle) return Angle;
function "-" (X : Angle) return Angle;
function "<" (X, Y : Angle) return Boolean;
function ">" (X, Y : Angle) return Boolean;
function "<=" (X, Y : Angle) return Boolean;
function ">=" (X, Y : Angle) return Boolean;
function "abs" (X : Angle) return Angle;
function "*" (X : Real; Y : Angle) return Angle;
function "*" (X : Angle; Y : Real) return Angle;
function "/" (X : Angle; Y : Real) return Angle;
function Sin (Theta : Angle) return Signed_Unit_Real;
function Cos (Theta : Angle) return Signed_Unit_Real;
function Tan (Theta : Angle) return Real;
function Arcsin (Y : Signed_Unit_Real) return Angle;
function Arccos (Y : Signed_Unit_Real) return Angle;
function Arctan (Y : Real;
X : Real := 1.0)
return Angle;
function From_Radians (Radians : Real) return Angle;
function From_Degrees (Degrees : Real) return Angle;
function To_Radians (Theta : Angle) return Real;
function To_Degrees (Theta : Angle) return Real;
function Image (X : Angle) return String;
function Value (X : String) return Angle;
private
type Angle is new Real range -Ada.Numerics.Pi .. Ada.Numerics.Pi;
Pi : constant Angle := Angle (Ada.Numerics.Pi);
pragma Import (Intrinsic, "abs");
overriding function ">" (X, Y : Angle) return Boolean is (Y < X);
overriding function "<=" (X, Y : Angle) return Boolean is (not (X > Y));
overriding function ">=" (X, Y : Angle) return Boolean is (not (Y > X));
overriding function "+" (X : Angle) return Angle is (X);
overriding function "-" (X : Angle) return Angle is
(Angle (-Real (X)));
function "*" (X : Real; Y : Angle) return Angle
is (From_Radians (X * To_Radians (Y)));
function "*" (X : Angle; Y : Real) return Angle
is (From_Radians (To_Radians (X) * Y));
function "/" (X : Angle; Y : Real) return Angle
is (From_Radians (To_Radians (X) / Y));
function Value (X : String) return Angle
is (From_Degrees (Real'Value (X)));
end WL.Numerics.Generic_Trigonometry;