module Data.Units.SI.Derived.Angle
( Angle
, Radian (..)
, normalizeRadians
, SolidAngle
, Steradian (..)
, LuminousFlux
, Lumen (..)
, Illuminance
, Lux (..)
)
where
import Data.Fixed
import Data.Coerce
import Data.Units.Base
import Data.Units.SI.System
import Data.Units.SI.Derived.NonAngle
type Angle = NormalizeDim (Length ./. Length)
$(mkUnit "Radian" "rad" ''Angle 1)
type SolidAngle = NormalizeDim (Angle .^+ 2)
$(mkUnit "Steradian" "sr" ''SolidAngle 1)
normalizeRadians :: (RealFrac a, Floating a) => Radian a -> Radian a
normalizeRadians :: forall a. (RealFrac a, Floating a) => Radian a -> Radian a
normalizeRadians Radian a
x = if Radian a
xmod Radian a -> Radian a -> Bool
forall a. Ord a => a -> a -> Bool
> Radian a
forall a. Floating a => a
pi then Radian a
xmod Radian a -> Radian a -> Radian a
forall a. Num a => a -> a -> a
- Radian a
twoPi else Radian a
xmod
where
twoPi :: Radian a
twoPi = Radian a
2 Radian a -> Radian a -> Radian a
forall a. Num a => a -> a -> a
* Radian a
forall a. Floating a => a
pi
xmod :: Radian a
xmod = Radian a
x Radian a -> Radian a -> Radian a
forall a. Real a => a -> a -> a
`mod'` Radian a
twoPi
type LuminousFlux = NormalizeDim (LuminousIntensity .*. SolidAngle)
$(mkUnit "Lumen" "lm" ''LuminousFlux 1)
type Illuminance = NormalizeDim (LuminousFlux ./. Area)
$(mkUnit "Lux" "lx" ''Illuminance 1)