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

import Text.XML.HXT.Arrow
import Text.XML.HXT.Extras
import Data.Geo.OSM.Accessor.K
import Data.Geo.OSM.Accessor.V

-- | The @tag@ element of a OSM file.
data Tag = Tag String String
  deriving Eq

instance XmlPickler Tag where
  xpickle = xpElem "tag" (xpWrap (uncurry tag, \(Tag k' v') -> (k', v')) (xpPair (xpAttr "k" xpText) (xpAttr "v" xpText)))

instance Show Tag where
  show = showPickled []

instance K Tag where
  k (Tag x _) = x
  setK a (Tag _ b) = tag a b

instance V Tag where
  v (Tag _ x) = x
  setV b (Tag a _) = tag a b

-- | Constructs a tag with a key and value.
tag :: String -- ^ The key (@k@ attribute).
       -> String -- ^ The value (@v@ attribute).
       -> Tag
tag = Tag