{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances #-}

-- | The @api@ element of a OSM file.
module Data.Geo.OSM.Api(
                         Api,
                         api
                       ) where

import Text.XML.HXT.Arrow
import Text.XML.HXT.Extras
import Data.Geo.OSM.VersionE
import Data.Geo.OSM.Area
import Data.Geo.OSM.Tracepoints
import Data.Geo.OSM.Waynodes
import Data.Geo.OSM.Accessor.Version
import Data.Geo.OSM.Accessor.Ar
import Data.Geo.OSM.Accessor.Tpoints
import Data.Geo.OSM.Accessor.Wnodes

-- | The @api@ element of a OSM file.
data Api = Api VersionE Area Tracepoints Waynodes
  deriving Eq

-- | Constructs a @api@ with version, area, tracepoints and waynodes.
api :: VersionE -- ^ The @version@ element.
       -> Area -- ^ The @area@ element.
       -> Tracepoints -- ^ The @tracepoints@ element.
       -> Waynodes -- ^ The @waynodes@ element.
       -> Api
api = Api

instance XmlPickler Api where
  xpickle = xpElem "api" (xpWrap (\(version', area', tracepoints', waypoints') -> api version' area' tracepoints' waypoints', \(Api version' area' tracepoints' waynodes') -> (version', area', tracepoints', waynodes')) (xp4Tuple (xpElem "version" xpickle) (xpElem "area" xpickle) (xpElem "tracepoints" xpickle) (xpElem "waynodes" xpickle)))

instance Show Api where
  show = showPickled []

instance Version Api VersionE where
  version (Api x _ _ _) = x
  setVersion a (Api _ b c d) = api a b c d

instance Ar Api where
  ar (Api _ x _ _) = x
  setAr b (Api a _ c d) = api a b c d

instance Tpoints Api where
  tpoints (Api _ _ x _) = x
  setTpoints c (Api a b _ d) = api a b c d

instance Wnodes Api where
  wnodes (Api _ _ _ x) = x
  setWnodes d (Api a b c _) = api a b c d