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

-- |

--

-- Module      :  Data.Units.SI.NonStd.Angle

-- Description :  Dimensionless non standard angle units

-- Copyright   :  (c) Alice Rixte 2025

-- License     :  BSD 3

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

-- Stability   :  unstable

-- Portability :  non-portable (GHC extensions)

--

-- Dimensionless non standard angle units.

--

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



module Data.Units.SI.NonStd.Angle where

import Data.Units.Base

-- | Angle in degrees.

--

$(mkUnitNoFactor "Degree" "°" ''NoDim)

-- | Angle in complete turns (also called cycles or revolutions)

--

-- See https://en.wikipedia.org/wiki/Turn_(angle)

--

$(mkUnitNoFactor "Turn" "tr" ''NoDim)

-- | Angle in gradians

--

-- See https://en.wikipedia.org/wiki/Gradian

--

$(mkUnitNoFactor "Gradian" "grad" ''NoDim)

instance Floating a => ConvertibleUnit Degree a

instance Floating a => ConversionFactor Degree a where
  factor :: a
factor = a
forall a. Floating a => a
pi a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
180
  {-# INLINE factor #-}

instance Floating a => ConvertibleUnit Turn a

instance Floating a => ConversionFactor Turn a where
  factor :: a
factor = a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Floating a => a
pi
  {-# INLINE factor #-}

instance Floating a => ConvertibleUnit Gradian a

instance Floating a => ConversionFactor Gradian a where
  factor :: a
factor = a
forall a. Floating a => a
pi a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
200
  {-# INLINE factor #-}