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

-- |

--

-- Module      :  Data.Units.SI.System

-- Description :  SI derived units not containing angles.

-- Copyright   :  (c) Alice Rixte 2025

-- License     :  BSD 3

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

-- Stability   :  stable

-- Portability :  non-portable (GHC extensions)

--

-- Derived units and dimensions for the International System of Units that do

-- not contain angles.

--

-- This follows the wikipedia page https://en.wikipedia.org/wiki/SI_derived_unit.

--

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



module Data.Units.SI.Derived.NonAngle
  ( -- * Official derived units from SI

    Celsius (..)
  , Area
  , Volume
  , Frequency
  , Hertz (..)
  , Radioactivity
  , Becquerel (..)
  , Speed
  , Acceleration
  , Force
  , Newton (..)
  , Pressure
  , Pascal (..)
  , Stress
  , Energy
  , Joule (..)
  , Work
  , Heat
  , Power
  , RadiantFlux
  , Watt (..)
  , ElectricCharge
  , Coulomb (..)
  , QuantityOfElectricity
  , Voltage
  , Volt (..)
  , ElectricPotential
  , ElectromotiveForce
  , Capacitance
  , Farad (..)
  , Resistance
  , Ohm (..)
  , Impedance
  , Reactance
  , Conductance
  , Siemens (..)
  , MagneticFlux
  , Weber (..)
  , MagneticInduction
  , MagneticFluxDensity
  , Tesla (..)
  , Inductance
  , Henry (..)
  , EquivalentDose
  , AbsorbedDose
  , Gray (..)
  , Sievert (..)
  , CatalyticActivity
  , Katal (..)
  )
  where

import Data.Units.Base
import Data.Units.SI.System

type Area = Length .^+ 2
type Volume = Length .^+ 3

type Frequency = Time .^- 1

-- | Frequency in hertz

--

$(mkUnit "Hertz" "Hz" ''Frequency 1)

type Radioactivity = Time .^- 1

-- | Radioactivity in becquerels

--

$(mkUnit "Becquerel" "Bq" ''Radioactivity 1)

-- | Speed quantity. Equal to

--

-- @'Length' .*. 'Time'.^-1@

--

type Speed = NormalizeDim (Length ./. Time)

type Acceleration = NormalizeDim (Length ./. Time .^+ 2)

-- | Acceleration quantity. Equal to

--

-- @'Length' .*. 'Time'.^-2@

--

type Force = NormalizeDim (Mass .*. Acceleration)

-- | Force in newtons

--

$(mkUnit "Newton" "N" ''Force 1)

-- | Pressure quantity. Equal to

--

-- @'Mass' .*. 'Length'.^-1 .*. 'Time'.^-2@

--

type Pressure = NormalizeDim (Force ./. (Length .^+ 2))
type Stress = Pressure

-- | Pressure in pascals

--

$(mkUnit "Pascal" "Pa" ''Pressure 1)

-- | Energy quantity. Equal to

--

-- @ 'Mass' .*. 'Length'.^+2 .*. 'Time'.^-2@

--

type Energy = NormalizeDim (Length .*. Force)
type Work = Energy
type Heat = Energy

-- | Energy in joules

--

$(mkUnit "Joule" "J" ''Energy 1)

-- | Power quantity. Equal to

--

-- @ 'Mass' .*. 'Length'.^+2 .*. 'Time'.^-3 @

--



type Power = NormalizeDim (Energy ./. Time)
type RadiantFlux = Power

-- | Power in watts

--

$(mkUnit "Watt" "W" ''Power 1)

-- | Electric charge quantity. Equal to

--

-- @ 'Time' .*. 'Current'@

--

type ElectricCharge = NormalizeDim (Time .*. Current)
type QuantityOfElectricity = ElectricCharge


$(mkUnit "Coulomb" "C" ''ElectricCharge 1)

-- | Electric voltage quantity. Equal to

--

-- @ 'Mass' .*. 'Length'.^+2 .*. 'Time'.^-3 .*. 'Current'.^-1@

--

type Voltage = NormalizeDim (Power ./. Current)
type ElectricPotential = Voltage
type ElectromotiveForce = Voltage

$(mkUnit "Volt" "V" ''Voltage 1)

-- | Electric capacitance quantity. Equal to

--

-- @'Mass'.^-1 .*. 'Length'.^-2 .*. 'Time'.^+4 .*. 'Current'.^+2@.

--

type Capacitance = NormalizeDim (ElectricCharge ./. Voltage)

$(mkUnit "Farad" "F" ''Capacitance 1)

-- | Electric resistance quantity. Equal to

--

-- @ 'Mass' .*. 'Length'.^+2 .*. 'Time'.^-3 .*. 'Current'.^-2@

--

type Resistance = NormalizeDim (Voltage ./. Current)
type Impedance = Resistance
type Reactance = Resistance

$(mkUnit "Ohm" "Ω" ''Resistance 1)

-- | Electric conductance quantity. Equal to

--

-- @ Mass.^-1 .*. Length.^-2 .*. Time.^+3 .*. Current.^+2 @

--

type Conductance = NormalizeDim (Current ./. Voltage)

$(mkUnit "Siemens" "S" ''Conductance 1)

-- | Magnetic flux quantity. Equal to

--

-- @ 'Mass' .*. 'Length'.^+2 .*. 'Time'.^-2 .*. 'Current'.^-1@

--

type MagneticFlux = NormalizeDim (Voltage .*. Time)

$(mkUnit "Weber" "Wb" ''MagneticFlux 1)

-- | Magnetic induction quantity. Equal to

--

-- @ 'Mass' .*. 'Time'.^-2 .*. 'Current'.^-1@

--

type MagneticInduction = NormalizeDim (MagneticFlux ./. (Length .^+ 2))
type MagneticFluxDensity = MagneticInduction

$(mkUnit "Tesla" "T" ''MagneticInduction 1)

-- | Inductance quantity. Equal to

--

-- @ 'Mass' .*. 'Length'.^+2 .*. 'Time'.^-2 .*. 'Current'.^-2@


type Inductance = NormalizeDim (MagneticFlux ./. Current)

$(mkUnit "Henry" "H" ''Inductance 1)

-- | Thermodynamic temperature in Celsius degrees

--

$(mkUnitNoFactor "Celsius" "°C" ''Temperature)

instance Fractional a => ConversionFactor Celsius a where
  factor :: a
factor = a
1
  {-# INLINE factor #-}

instance Fractional a => ConvertibleUnit Celsius a where
  toBaseUnit :: Celsius a -> BaseUnitOf Celsius a
toBaseUnit (Celsius a
x) = a -> Kelvin a
forall a. a -> Kelvin a
Kelvin (a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
273.15)
  {-# INLINE toBaseUnit #-}

  fromBaseUnit :: BaseUnitOf Celsius a -> Celsius a
fromBaseUnit (Kelvin a
x) = a -> Celsius a
forall a. a -> Celsius a
Celsius (a
x a -> a -> a
forall a. Num a => a -> a -> a
- a
273.15)
  {-# INLINE fromBaseUnit #-}

-- | Absorbed dose quantity. Equal to

--

-- @ 'Length'.^+2 .*. 'Time'.^-2 @

--

type AbsorbedDose = NormalizeDim (Energy ./. Mass)
type EquivalentDose = AbsorbedDose

-- | Absorbed dose in grays

--

$(mkUnit "Gray" "Gy" ''AbsorbedDose 1)

-- | Dose equivalent in sieverts

--

$(mkUnit "Sievert" "Sv" ''EquivalentDose 1)

-- | Catalytic activity quantity. Equal to

--

-- @ 'Time'.^-1 .*. 'AmountOfSubstance' @

--

type CatalyticActivity = NormalizeDim (AmountOfSubstance ./. Time)

-- | Catalytic activity in katal

--

$(mkUnit "Katal" "kat" ''CatalyticActivity 1)