geodetic-0.1.0: src/Data/Geo/Geodetic/Sphere.hs
-- | A sphere with a radius in metres.
module Data.Geo.Geodetic.Sphere(
Sphere
, HasSphere(..)
, nSphere
, earthMean
) where
import Prelude(Double, Bool(..), Eq, Show(..), Ord(..), id, (&&), (++), (.), abs, showParen, showString)
import Control.Lens(Iso', Lens', iso)
import Text.Printf(printf)
-- $setup
-- >>> import Control.Lens((#), (^.))
-- >>> import Data.Foldable(all)
-- >>> import Prelude(Eq(..))
newtype Sphere =
Sphere Double
deriving (Eq, Ord)
-- | A show instance that prints to 4 decimal places.
-- This is to take floating-point rounding errors into account.
instance Show Sphere where
showsPrec n (Sphere d) =
showParen (n > 10) (showString ("Sphere " ++ printf "%0.4f" d))
-- | An isomorphism on sphere to a double.
--
-- >>> 7 ^. nSphere
-- Sphere 7.0000
--
-- >>> 0 ^. nSphere
-- Sphere 0.0000
--
-- >>> (-7) ^. nSphere
-- Sphere -7.0000
nSphere ::
Iso' Double Sphere
nSphere =
iso Sphere (\(Sphere d) -> d)
earthMean ::
Sphere
earthMean =
Sphere 6367450
class HasSphere t where
sphere ::
Lens' t Sphere
instance HasSphere Sphere where
sphere =
id