radian-0.0.1: src/Data/Radian.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Data.Radian(
Radian
, radians
, degrees
) where
import Control.Lens(Iso, iso, from)
import Data.Eq(Eq)
import Data.Ord(Ord)
import Prelude(Show, Num((*)), Fractional((/)), Floating, pi)
-- $setup
-- >>> import Control.Lens((#))
-- >>> import Prelude(Double)
newtype Radian a =
Radian a
deriving (Eq, Ord, Show, Num, Fractional)
-- | An isomorphism from radians to degrees.
--
-- >>> radians # (180 :: Double)
-- Radian 3.141592653589793
--
-- >> radians # (90 :: Double)
-- Radian 1.5707963267948966
--
-- >>> radians # (359 :: Double)
-- Radian 6.265732014659643
--
-- >>> radians # (360 :: Double)
-- Radian 6.283185307179586
--
-- >>> radians # (3600 :: Double)
-- Radian 62.83185307179586
--
-- >>> radians # (1 :: Double)
-- Radian 1.7453292519943295e-2
--
-- >>> radians # ((-180) :: Double)
-- Radian (-3.141592653589793)
radians ::
(Floating a, Floating b) =>
Iso (Radian a) (Radian b) a b
radians =
iso
(\(Radian a) -> a / pi * 180)
(\a -> Radian (a / 180 * pi))
-- | An isomorphism from degrees to radians.
--
-- >>> degrees # (3.14 :: Radian Double)
-- 179.90874767107852
--
-- >>> degrees # (1 :: Radian Double)
-- 57.29577951308232
--
-- >>> degrees # (10 :: Radian Double)
-- 572.9577951308232
--
-- >>> degrees # (0 :: Radian Double)
-- 0.0
--
-- >>> degrees # (-1 :: Radian Double)
-- -57.29577951308232
--
-- >>> degrees # (-3 :: Radian Double)
-- -171.88733853924697
degrees ::
(Floating a, Floating b) =>
Iso a b (Radian a) (Radian b)
degrees =
from radians