{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}

module Data.Geodetic.Ellipsoid(
  Ellipsoid(..)
, HasEllipsoid(..)
, flatteningReciprocal
, wgs84
) where

import Control.Applicative(Applicative((<*>)))
import Control.Category((.))
import Control.Lens(makeClassy, Lens', involuted)
import Data.Eq(Eq)
import Data.Functor((<$>))
import Data.Geodetic.HasDoubles(HasDoubles(doubles))
import Data.Ord(Ord)
import Prelude(Show, Double, (/))

data Ellipsoid =
  Ellipsoid {
    _semiMajor ::
      Double
  , _flattening ::
      Double
  } deriving (Eq, Ord, Show)

makeClassy ''Ellipsoid

instance HasDoubles Ellipsoid where
  doubles f (Ellipsoid s l) =
    Ellipsoid <$> f s <*> f l

flatteningReciprocal ::
  HasEllipsoid e =>
  Lens'
    e
    Double
flatteningReciprocal =
  flattening . involuted (1/)

wgs84 ::
  Ellipsoid
wgs84 =
  Ellipsoid
    6378137
    298.257223563