-- | The @type@ attribute of a @member@ element of a OSM file.
module Geo.OSM.MemberType(
                           MemberType,
                           foldMemberType,
                           wayType,
                           nodeType,
                           relationType
                         ) where

import Text.XML.HXT.Arrow
import Text.XML.HXT.Extras
import Control.Applicative
import Data.Char

-- | The @type@ attribute of a @member@ element of a OSM file.
data MemberType = WayType | NodeType | RelationType
  deriving Eq

-- | Folds a member-type (catamorphism).
foldMemberType :: MemberType -- ^ The member-type to fold.
                  -> x -- ^ If the type is a way.
                  -> x -- ^ If the type is a node.
                  -> x -- ^ If the type is a relation.
                  -> x
foldMemberType WayType x _ _ = x
foldMemberType NodeType _ x _ = x
foldMemberType RelationType _ _ x = x

instance XmlPickler MemberType where
  xpickle = xpWrapMaybe (\s -> case toLower <$> s of "way" -> Just WayType
                                                     "node" -> Just NodeType
                                                     "relation" -> Just RelationType
                                                     _ -> Nothing,
                         \t -> case t of WayType -> "way"
                                         NodeType -> "node"
                                         RelationType -> "relation") (xpAttr "type" xpText)

instance Show MemberType where
  show = showPickled []

-- | Constructs a member-type that is a way.
wayType :: MemberType
wayType = WayType

-- | Constructs a member-type that is a node.
nodeType :: MemberType
nodeType = NodeType

-- | Constructs a member-type that is a relation.
relationType :: MemberType
relationType = RelationType