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

module Data.Geodetic.ECEF(
  ECEF(..)
, HasECEF(..)
) where

import Control.Applicative(Applicative((<*>)))
import Control.Lens(makeClassy, lens)
import Data.Eq(Eq)
import Data.Functor((<$>))
import Data.Geodetic.HasDoubles(HasDoubles(doubles))
import Data.Geodetic.XY(XY, HasXY(xY))
import Data.Ord(Ord)
import Prelude(Show, Double)

data ECEF =
  ECEF {
    _xy ::
    XY
  , _z ::
      Double
  }
  deriving (Eq, Ord, Show)

makeClassy ''ECEF

instance HasXY ECEF where
  xY =
    lens
      (\(ECEF xy_ _) -> xy_)
      (\(ECEF _ z_) xy_ -> ECEF xy_ z_)

instance HasDoubles ECEF where
  doubles f (ECEF xy_ z_) =
    ECEF <$>
      doubles f xy_ <*>
      f z_