{-# LANGUAGE FlexibleInstances #-}

-- | Compatibility interface between `xml` and `xml-types`.
module Data.XML.Compat where

import Prelude.Compat

import Data.Text (Text)
import qualified Data.Text as T
import Data.XML.Types

import Safe

type Attr = (Name, [Content])

mkAttr :: Text -> Text -> Attr
mkAttr k = mkNAttr (Name k Nothing Nothing)

mkNAttr :: Name -> Text -> Attr
mkNAttr k v = (k, [ContentText v])

attrKey :: Attr -> Name
attrKey = fst

strContent :: Element -> Text
strContent = T.concat . elementText

class ToNode t where
  unode :: Name -> t -> Element

instance ToNode [Attr] where
  unode n as = Element n as []

instance ToNode [Element] where
  unode n = Element n [] . map NodeElement

instance ToNode ([Attr], Text) where
  unode n (as, t) = Element n as [NodeContent $ ContentText t]

instance ToNode Text where
  unode n t = unode n ([] :: [Attr], t)

findChildren :: Name -> Element -> [Element]
findChildren n el = filter ((n ==) . elementName) $ elementChildren el

findChild :: Name -> Element -> Maybe Element
findChild = (headMay .) <$> findChildren

findElements :: Name -> Element -> [Element]
findElements n e
  | n == elementName e = [e]
  | otherwise = concatMap (findElements n) $ elementChildren e

findElement :: Name -> Element -> Maybe Element
findElement = (headMay .) <$> findElements