{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} module Tests.Compile.MetrologySynonyms where import Data.Metrology import Data.Metrology.SI.Poly import Data.Metrology.Unsafe import Text.Printf ---------------------------------------------------------------- -- Pretty Printing Functions ---------------------------------------------------------------- ppValF :: PrintfArg x => String -> Qu d l x -> String ppValF fmtStr (Qu x) = printf fmtStr x -- ++ showFactor (Proxy :: Proxy (LookupList dims lcsu))) ppValE :: PrintfArg x => Int -> Qu d l x -> String ppValE d (Qu x) = ret where fmtStr :: String fmtStr = printf "%%.%de" d protoStr :: String protoStr = printf fmtStr x (valPart,expPart) = break (=='e') protoStr ret = case expPart of "e0" -> valPart _ -> printf "%s \\times 10^{%s}" valPart (drop 1 expPart) ---------------------------------------------------------------- -- Nonweighted units ---------------------------------------------------------------- type PerSecond = Number :/ Second type PerCm3 = Second :^ MThree type PerCm2 = Second :^ MTwo type PerCm = (Centi :@ Meter) :^ MTwo type GHz = (Giga :@ Hertz) ---------------------------------------------------------------- -- Weighted units ---------------------------------------------------------------- -- densities type GramPerCm2 = Gram :* PerCm2 type GramPerCm3 = Gram :* PerCm3 type JouleM3 = Joule :/ (Meter :^ Three) -- see the table in http://en.wikipedia.org/wiki/Spectral_irradiance type SpectralRadiance = Watt :/ (Meter :^ Two) :/ Hertz -- | Spectral Flux Density -- type SpectralFluxDensity = '[ '(Mass, POne), '(Time, NTwo)] -- |Unit of EDP data Jansky = Jansky instance Show Jansky where show _ = "Jy" instance Unit Jansky where type BaseUnit Jansky = Joule :/ (Meter :^ Two) :* Second conversionRatio _ = 1e-26 -- energies data ElectronVolt = ElectronVolt instance Show ElectronVolt where show _ = "eV" instance Unit ElectronVolt where type BaseUnit ElectronVolt = Joule conversionRatio _ = 1.60217657e-19 type JouleSecond = Joule :* Second -- velocities type KmPerSec = (Kilo :@ Meter) :/ Second type MPerSec = Meter :/ Second type CmPerSec = (Centi :@ Meter) :/ Second type Kg = Kilo :@ Gram type GramPerMole = Gram :/ Mole data AU = AU instance Show AU where show _ = "au" instance Unit AU where type BaseUnit AU = Meter conversionRatio _ = 149597870700 data Parsec = Parsec instance Show Parsec where show _ = "pc" instance Unit Parsec where type BaseUnit Parsec = Meter conversionRatio _ = 3.08567758e16 -- squared velocities type Cm2PerSec2 = CmPerSec :^ Two type Meter2PerSec2 = MPerSec :^ Two type Sec2PerMeter2 = MPerSec :^ MTwo -- areas type Meter2 = Meter :^ Two type Cm2 = (Centi :@ Meter) :^ Two type SIGCUnit = (Meter :^ Three) :* ((Kilo :@ Gram) :^ MOne) :* (Second :^ MTwo) type SIkBUnit = Joule :/ Kelvin ---------------------------------------------------------------- -- Electric Units ---------------------------------------------------------------- type VoltPerCm = Volt :/ (Centi :@ Meter) type KVPerCm = (Kilo :@ Volt) :/ (Centi :@ Meter) type CoulombPerCm2 = Coulomb :/ Cm2 -- eps0 type SIPermittivityUnit = ((Kilo :@ Gram) :^ MOne) :* (Meter :^ MThree) :* (Second :^ Four) :* (Ampere :^ Two) -- mu0 type SIPermeabilityUnit = ((Kilo :@ Gram) :^ One) :* (Meter :^ One) :* (Second :^ MTwo) :* (Ampere :^ MTwo) -- dipole moment data Debye = Debye instance Unit Debye where type BaseUnit Debye = Coulomb :* Meter conversionRatio _ = 1e-21/299792458