module Data.Constants.Mechanics.Extra
  ( turn
  , halfTurn
  , addRad
  , delRad
  ) where

import           Data.Coerce
import qualified Data.Dimensions.SI            as D
import           Data.Metrology
import           Data.Metrology.SI              ( )
import           Data.Metrology.Unsafe
import           Data.Units.SI

type PlaneAngle = MkQu_DLN D.PlaneAngle 'DefaultLCSU

-- | One complete revolution in radians
turn :: Floating a => PlaneAngle a
turn :: forall a. Floating a => PlaneAngle a
turn = Qu '[] 'DefaultLCSU a
2 forall n (a :: [Factor (*)]) (l :: LCSU (*)) (b :: [Factor (*)]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| forall a. Floating a => PlaneAngle a
halfTurn

-- | π radians
halfTurn :: Floating a => PlaneAngle a
halfTurn :: forall a. Floating a => PlaneAngle a
halfTurn = forall a. Floating a => a
pi forall (dim :: [Factor (*)]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% Radian
Radian

-- | Multiply by 1 radian
addRad
  :: Qu b 'DefaultLCSU a
  -> Qu (Normalize ('[ 'F D.PlaneAngle One] @+ b)) 'DefaultLCSU a
addRad :: forall (b :: [Factor (*)]) a.
Qu b 'DefaultLCSU a
-> Qu (Normalize ('[ 'F PlaneAngle One] @+ b)) 'DefaultLCSU a
addRad = coerce :: forall a b. Coercible a b => a -> b
coerce

-- | Divide by 1 radian
delRad
  :: Qu u 'DefaultLCSU a
  -> Qu (Normalize (u @- '[ 'F D.PlaneAngle One])) 'DefaultLCSU a
delRad :: forall (u :: [Factor (*)]) a.
Qu u 'DefaultLCSU a
-> Qu (Normalize (u @- '[ 'F PlaneAngle One])) 'DefaultLCSU a
delRad = coerce :: forall a b. Coercible a b => a -> b
coerce