--------------------------------------------------------------------------------

-- |

--

-- Module      :  Data.Units.AngleSI.Derived

-- Description :  Dimensionless angles

-- Copyright   :  (c) Alice Rixte 2025

-- License     :  BSD 3

-- Maintainer  :  alice.rixte@u-bordeaux.fr

-- Stability   :  unstable

-- Portability :  non-portable (GHC extensions)

--

-- This module defines SI derived units that use angles, where angles have a

-- dimension @`A`@.

--

-- See "Data.Units.SI.Derived.Angle" for an equivalent of this where angles are

-- dimensionless.

--

--------------------------------------------------------------------------------


module Data.Units.AngleSI.Derived
  ( module Data.Units.SI.Derived.NonAngle
  , SolidAngle
  , Steradian (..)
  , LuminousFlux
  , Lumen (..)
  , Illuminance
  , Lux (..)
  )
  where

import Data.Coerce

import Data.Units.Base
import Data.Units.AngleSI.System
import Data.Units.SI.Derived.NonAngle


-- | Solid angle quantity.

type SolidAngle = Angle .^+ 2

-- | A solid angle in steradians.

--

$(mkUnit "Steradian" "sr" ''SolidAngle 1)

-- | Luminous flux quantity. Equal to

--

-- @ 'Angle'.^+2 .*. 'LuminousIntensity'@

--

type LuminousFlux = NormalizeDim (LuminousIntensity .*. SolidAngle)

-- | Luminous flux in lumens

--

$(mkUnit "Lumen" "lm" ''LuminousFlux 1)

-- | Illuminance quantity. Equal to

--

-- @ 'Angle'.^+2 .*. 'Length'.^-2 .*. 'LuminousIntensity' @

--

type Illuminance = NormalizeDim (LuminousFlux ./. Area)

-- | Illuminance in lux

--

$(mkUnit "Lux" "lx" ''Illuminance 1)