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 :: PlaneAngle a
turn = 2 Qu '[] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu (Normalize ('[] @+ '[ 'F PlaneAngle One])) 'DefaultLCSU a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a. Floating a => PlaneAngle a
halfTurn

-- | π radians
halfTurn :: Floating a => PlaneAngle a
halfTurn :: PlaneAngle a
halfTurn = a
forall a. Floating a => a
pi a -> Radian -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
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 :: Qu b 'DefaultLCSU a
-> Qu (Normalize ('[ 'F PlaneAngle One] @+ b)) 'DefaultLCSU a
addRad = Qu b 'DefaultLCSU a
-> Qu (Normalize ('[ 'F PlaneAngle One] @+ b)) 'DefaultLCSU a
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 :: Qu u 'DefaultLCSU a
-> Qu (Normalize (u @- '[ 'F PlaneAngle One])) 'DefaultLCSU a
delRad = Qu u 'DefaultLCSU a
-> Qu (Normalize (u @- '[ 'F PlaneAngle One])) 'DefaultLCSU a
forall a b. Coercible a b => a -> b
coerce