module Text.XML.WraXML.Document where

import qualified Text.XML.WraXML.Tree as XmlTree
import qualified Text.XML.Basic.Attribute as Attr
import qualified Text.XML.Basic.Name as Name
import qualified Text.XML.Basic.Format as Format

import Control.Applicative (Applicative, liftA2, )
import Data.Traversable (traverse, )


data T i name str =
   Cons {
      forall i name str. T i name str -> Maybe [T name str]
xmlDeclaration :: Maybe [Attr.T name str],
      forall i name str. T i name str -> Maybe String
docType :: Maybe String,
      forall i name str. T i name str -> [T i name str]
content :: [XmlTree.T i name str]
   } deriving Int -> T i name str -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall i name str.
(Attribute name, Show str, Show i, Show name) =>
Int -> T i name str -> ShowS
forall i name str.
(Attribute name, Show str, Show i, Show name) =>
[T i name str] -> ShowS
forall i name str.
(Attribute name, Show str, Show i, Show name) =>
T i name str -> String
showList :: [T i name str] -> ShowS
$cshowList :: forall i name str.
(Attribute name, Show str, Show i, Show name) =>
[T i name str] -> ShowS
show :: T i name str -> String
$cshow :: forall i name str.
(Attribute name, Show str, Show i, Show name) =>
T i name str -> String
showsPrec :: Int -> T i name str -> ShowS
$cshowsPrec :: forall i name str.
(Attribute name, Show str, Show i, Show name) =>
Int -> T i name str -> ShowS
Show

instance
   (Name.Tag name, Name.Attribute name) =>
      Functor (T i name) where
   fmap :: forall a b. (a -> b) -> T i name a -> T i name b
fmap a -> b
f = forall name str0 str1 i.
(Tag name, Attribute name) =>
(str0 -> str1)
-> ([T i name str0] -> [T i name str1])
-> T i name str0
-> T i name str1
lift a -> b
f (forall a b. (a -> b) -> [a] -> [b]
map (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f))

lift ::
   (Name.Tag name, Name.Attribute name) =>
   (str0 -> str1) ->
   ([XmlTree.T i name str0] -> [XmlTree.T i name str1]) ->
   T i name str0 -> T i name str1
lift :: forall name str0 str1 i.
(Tag name, Attribute name) =>
(str0 -> str1)
-> ([T i name str0] -> [T i name str1])
-> T i name str0
-> T i name str1
lift str0 -> str1
g [T i name str0] -> [T i name str1]
f (Cons Maybe [T name str0]
xml Maybe String
dtd [T i name str0]
trees) =
   forall i name str.
Maybe [T name str]
-> Maybe String -> [T i name str] -> T i name str
Cons (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (a -> b) -> [a] -> [b]
map (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap str0 -> str1
g)) Maybe [T name str0]
xml) Maybe String
dtd forall a b. (a -> b) -> a -> b
$ [T i name str0] -> [T i name str1]
f [T i name str0]
trees

liftA ::
   (Name.Tag name, Name.Attribute name, Applicative m) =>
   (str0 -> m str1) ->
   ([XmlTree.T i name str0] -> m [XmlTree.T i name str1]) ->
   T i name str0 -> m (T i name str1)
liftA :: forall name (m :: * -> *) str0 str1 i.
(Tag name, Attribute name, Applicative m) =>
(str0 -> m str1)
-> ([T i name str0] -> m [T i name str1])
-> T i name str0
-> m (T i name str1)
liftA str0 -> m str1
g [T i name str0] -> m [T i name str1]
f (Cons Maybe [T name str0]
xml Maybe String
dtd [T i name str0]
trees) =
   forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
      (\Maybe [T name str1]
xmlDecl [T i name str1]
cnt -> forall i name str.
Maybe [T name str]
-> Maybe String -> [T i name str] -> T i name str
Cons Maybe [T name str1]
xmlDecl Maybe String
dtd [T i name str1]
cnt)
      (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse str0 -> m str1
g)) Maybe [T name str0]
xml) ([T i name str0] -> m [T i name str1]
f [T i name str0]
trees)


formatXMLDeclaration ::
   (Name.Tag name, Name.Attribute name, Format.C string) =>
   [Attr.T name string] -> ShowS
formatXMLDeclaration :: forall name string.
(Tag name, Attribute name, C string) =>
[T name string] -> ShowS
formatXMLDeclaration [T name string]
attrs =
   String -> ShowS
showString String
"<?xml" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall name string.
(Attribute name, C string) =>
[T name string] -> ShowS
Attr.formatListBlankHead [T name string]
attrs forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"?>" forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   ShowS
Format.nl

formatDocType :: String -> ShowS
formatDocType :: String -> ShowS
formatDocType String
dtdStr =
   ShowS -> ShowS
Format.angle (String -> ShowS
showString String
"!DOCTYPE " forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
dtdStr) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   ShowS
Format.nl

format ::
   (Name.Tag name, Name.Attribute name, Format.C string) =>
   T i name string -> ShowS
format :: forall name string i.
(Tag name, Attribute name, C string) =>
T i name string -> ShowS
format (Cons Maybe [T name string]
xml Maybe String
dtd [T i name string]
trees) =
   forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. a -> a
id forall name string.
(Tag name, Attribute name, C string) =>
[T name string] -> ShowS
formatXMLDeclaration Maybe [T name string]
xml forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. a -> a
id String -> ShowS
formatDocType Maybe String
dtd forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   forall name string i.
(Tag name, Attribute name, C string) =>
[T i name string] -> ShowS
XmlTree.formatMany [T i name string]
trees

instance
   (Name.Tag name, Name.Attribute name, Format.C string) =>
      Format.C (T i name string) where
   run :: T i name string -> ShowS
run = forall name string i.
(Tag name, Attribute name, C string) =>
T i name string -> ShowS
format