module Data.GPS.Coordinate.Latitude(
  Latitude
, latitude
, latitudeF
) where

import Prelude(Double, Eq, Show, Ord(..), Num(..), Bool(..), Monad(..), (&&), properFraction, fromIntegral)
import Control.Lens(Iso', Prism', iso, prism', (#), (^?))
import Data.GPS.Coordinate.DegreesLatitude
import Data.GPS.Coordinate.Minutes
import Data.GPS.Coordinate.Seconds

data Latitude =
  Latitude
    DegreesLatitude
    Minutes
    Seconds
  deriving (Eq, Show)

latitude ::
  Iso' (DegreesLatitude, Minutes, Seconds) Latitude
latitude =
  iso (\(d, m, s) -> Latitude d m s) (\(Latitude d m s) -> (d, m, s))

latitudeF ::
  Prism' Double Latitude
latitudeF =
  prism' (\(Latitude d m s) ->
    fromIntegral (degreesLatitude # d) + seconds # s + fromIntegral (minutes # m * 60))
    (\x -> let (d, z) = properFraction x
               (m, s) = properFraction ((z :: Double) * 60)
           in do d' <- d ^? degreesLatitude
                 m' <- m ^? minutes
                 s' <- s ^? seconds
                 return (Latitude d' m' s'))