-- | A coordinate on earth with a latitude and longitude.
module Data.Geo.Coord(
                       Coord,
                       (|.|),
                       (!.!),
                       (|..|),
                       radians'
                     ) where

import Data.Geo.Latitude
import Data.Geo.Longitude
import Data.Geo.Radians
import Data.Geo.Accessor.Lat
import Data.Geo.Accessor.Lon
import Data.Geo.Accessor.Value
import Control.Applicative
import Control.Arrow

data Coord = Coord Latitude Longitude
  deriving Eq

instance Lat Coord where
  lat (Coord x _) = x

instance Lon Coord where
  lon (Coord _ x) = x

instance Show Coord where
  show = show . (value . lat &&& value . lon)

-- | Construct a coordinate with the given latitude and longitude.
(|.|) :: Latitude -> Longitude -> Coord
(|.|) = Coord

infixl 8 |.|

-- | -- | Construct a coordinate with the given latitude and longitude in degrees.
(!.!) :: Double -> Double -> Coord
(!.!) x y = latitude x |.| longitude y

infixl 8 !.!

-- | -- | Construct a coordinate with the given latitude and longitude in radians.
(|..|) :: Double -> Double -> Coord
(|..|) lat' lon' = fromRadians lat' |.| fromRadians lon'

infixl 8 |..|

-- | Convert the latitude and longitude of the given coordinate to radians.
radians' :: Coord -> (Double, Double)
radians' = radians <$> lat <*> lon