{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, MultiParamTypeClasses #-}

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

import Text.XML.HXT.Arrow.Pickle
import Data.Geo.OSM.Lens.MaximumL
import Data.Lens.Common
import Control.Comonad.Trans.Store
import Control.Newtype

-- | The @area@ element of a OSM file.
newtype Area =
  Area String
  deriving Eq

-- | Constructs a @area@ with maximum.
area ::
  String -- ^ The @area@ element.
  -> Area
area =
  Area

instance XmlPickler Area where
  xpickle =
    xpElem "area" (xpWrap (area, \(Area r) -> r) (xpAttr "maximum" xpText))

instance Show Area where
  show =
    showPickled []

instance MaximumL Area where
  maximumL =
    Lens $ \(Area maximum) -> store (\maximum -> Area maximum) maximum

instance Newtype Area String where
  pack = 
    Area
  unpack (Area x) =
    x