coordinate-0.0.2: src/Data/GPS/Coordinate/Longitude.hs
module Data.GPS.Coordinate.Longitude(
Longitude
, HasLongitude(..)
, dmsLongitude
, fracLongitude
) where
import Prelude(Double, Eq, Show, Ord(..), Num(..), Bool(..), Monad(..), id, (&&), properFraction, fromIntegral)
import Control.Lens(Iso', Prism', Lens', iso, prism', lens, (#), (^?))
import Data.GPS.Coordinate.DegreesLongitude
import Data.GPS.Coordinate.Minutes
import Data.GPS.Coordinate.Seconds
data Longitude =
Longitude
DegreesLongitude
Minutes
Seconds
deriving (Eq, Show)
dmsLongitude ::
Iso' (DegreesLongitude, Minutes, Seconds) Longitude
dmsLongitude =
iso (\(d, m, s) -> Longitude d m s) (\(Longitude d m s) -> (d, m, s))
fracLongitude ::
Prism' Double Longitude
fracLongitude =
prism' (\(Longitude d m s) ->
fromIntegral (nDegreesLongitude # d) + nSeconds # s + fromIntegral (nMinutes # m * 60))
(\x -> let (d, z) = properFraction x
(m, s) = properFraction ((z :: Double) * 60)
in do d' <- d ^? nDegreesLongitude
m' <- m ^? nMinutes
s' <- s ^? nSeconds
return (Longitude d' m' s'))
class HasLongitude t where
longitude ::
Lens' t Longitude
instance HasLongitude Longitude where
longitude =
id
instance HasDegreesLongitude Longitude where
degreesLongitude =
lens (\(Longitude d _ _) -> d) (\(Longitude _ m s) d -> Longitude d m s)
instance HasMinutes Longitude where
minutes =
lens (\(Longitude _ m _) -> m) (\(Longitude d _ s) m -> Longitude d m s)
instance HasSeconds Longitude where
seconds =
lens (\(Longitude _ _ s) -> s) (\(Longitude d m _) s -> Longitude d m s)