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

module Data.Geodetic.LL(
  LL(..)
, HasLL(..)
, degrees
, (<◦>)
) where

import Data.Geodetic.HasDoubles(HasDoubles(doubles))
import Papa

data LL =
  LL {
    _lat ::
      Double -- radians
  , _lon ::
      Double -- radians
  }
  deriving (Eq, Ord, Show)

makeClassy ''LL

instance HasDoubles LL where
  doubles f (LL a o) =
    LL <$>
      f a <*>
      f o

degrees ::
  Iso'
    (Double, Double)
    LL
degrees =
  iso 
    (\(t, n) -> let r a = a / 180 * pi
                in  LL (r t) (r n))
    (\(LL t n) -> let r a = a / pi * 180
                  in  (r t, r n))

(<◦>) ::
  Double
  -> Double
  -> LL
t <◦> n =
  (t, n) ^. degrees