module Data.GPS.Coordinate.Longitude(
  Longitude
, longitude
, longitudeF
) where

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

data Longitude =
  Longitude
    DegreesLongitude
    Minutes
    Seconds
  deriving (Eq, Show)

longitude ::
  Iso' (DegreesLongitude, Minutes, Seconds) Longitude
longitude =
  iso (\(d, m, s) -> Longitude d m s) (\(Longitude d m s) -> (d, m, s))

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