{-# LANGUAGE CPP, MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts, FlexibleInstances, TypeFamilies, OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Web.Routes.XMLGenT where

import Control.Applicative ((<$>))
import Data.Monoid ((<>))
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import HSP
import Web.Routes.RouteT (RouteT, MonadRoute(..), showURL, URL)

instance (Functor m, Monad m) => XMLGen (RouteT url m) where
    type XMLType (RouteT url m)    = XML
    type StringType (RouteT url m) = TL.Text
    newtype ChildType (RouteT url m) = UChild { ChildType (RouteT url m) -> XML
unUChild :: XML }
    newtype AttributeType (RouteT url m) = UAttr { AttributeType (RouteT url m) -> Attribute
unUAttr :: Attribute }
    genElement :: Name (StringType (RouteT url m))
-> [XMLGenT (RouteT url m) [AttributeType (RouteT url m)]]
-> [XMLGenT (RouteT url m) [ChildType (RouteT url m)]]
-> XMLGenT (RouteT url m) (XMLType (RouteT url m))
genElement Name (StringType (RouteT url m))
n [XMLGenT (RouteT url m) [AttributeType (RouteT url m)]]
attrs [XMLGenT (RouteT url m) [ChildType (RouteT url m)]]
children =
        do [Attribute]
attribs <- (AttributeType (RouteT url m) -> Attribute)
-> [AttributeType (RouteT url m)] -> [Attribute]
forall a b. (a -> b) -> [a] -> [b]
map AttributeType (RouteT url m) -> Attribute
forall url (m :: * -> *). AttributeType (RouteT url m) -> Attribute
unUAttr ([AttributeType (RouteT url m)] -> [Attribute])
-> XMLGenT (RouteT url m) [AttributeType (RouteT url m)]
-> XMLGenT (RouteT url m) [Attribute]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [XMLGenT (RouteT url m) [AttributeType (RouteT url m)]]
-> XMLGenT (RouteT url m) [AttributeType (RouteT url m)]
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr [XMLGenT (RouteT url m) [AttributeType (RouteT url m)]]
attrs
           [XML]
childer <- [XML] -> [XML]
flattenCDATA ([XML] -> [XML])
-> ([ChildType (RouteT url m)] -> [XML])
-> [ChildType (RouteT url m)]
-> [XML]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChildType (RouteT url m) -> XML)
-> [ChildType (RouteT url m)] -> [XML]
forall a b. (a -> b) -> [a] -> [b]
map ChildType (RouteT url m) -> XML
forall url (m :: * -> *). ChildType (RouteT url m) -> XML
unUChild ([ChildType (RouteT url m)] -> [XML])
-> XMLGenT (RouteT url m) [ChildType (RouteT url m)]
-> XMLGenT (RouteT url m) [XML]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [XMLGenT (RouteT url m) [ChildType (RouteT url m)]]
-> XMLGenT (RouteT url m) [ChildType (RouteT url m)]
forall (m :: * -> *) c. EmbedAsChild m c => c -> GenChildList m
asChild [XMLGenT (RouteT url m) [ChildType (RouteT url m)]]
children
           XML -> XMLGenT (RouteT url m) XML
forall (m :: * -> *) a. Monad m => a -> m a
return (NSName -> [Attribute] -> [XML] -> XML
Element
                              (NSName -> NSName
forall n s. IsName n s => n -> Name s
toName NSName
Name (StringType (RouteT url m))
n)
                              [Attribute]
attribs
                              [XML]
childer
                             )
    xmlToChild :: XMLType (RouteT url m) -> ChildType (RouteT url m)
xmlToChild = XMLType (RouteT url m) -> ChildType (RouteT url m)
forall url (m :: * -> *). XML -> ChildType (RouteT url m)
UChild
    pcdataToChild :: StringType (RouteT url m) -> ChildType (RouteT url m)
pcdataToChild = XML -> ChildType (RouteT url m)
forall (m :: * -> *). XMLGen m => XMLType m -> ChildType m
xmlToChild (XML -> ChildType (RouteT url m))
-> (Text -> XML) -> Text -> ChildType (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> XML
pcdata

flattenCDATA :: [XML] -> [XML]
flattenCDATA :: [XML] -> [XML]
flattenCDATA [XML]
cxml =
                case [XML] -> [XML] -> [XML]
flP [XML]
cxml [] of
                 [] -> []
                 [CDATA Bool
_ Text
""] -> []
                 [XML]
xs -> [XML]
xs
    where
        flP :: [XML] -> [XML] -> [XML]
        flP :: [XML] -> [XML] -> [XML]
flP [] [XML]
bs = [XML] -> [XML]
forall a. [a] -> [a]
reverse [XML]
bs
        flP [XML
x] [XML]
bs = [XML] -> [XML]
forall a. [a] -> [a]
reverse (XML
xXML -> [XML] -> [XML]
forall a. a -> [a] -> [a]
:[XML]
bs)
        flP (XML
x:XML
y:[XML]
xs) [XML]
bs = case (XML
x,XML
y) of
                           (CDATA Bool
e1 Text
s1, CDATA Bool
e2 Text
s2) | Bool
e1 Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
e2 -> [XML] -> [XML] -> [XML]
flP (Bool -> Text -> XML
CDATA Bool
e1 (Text
s1Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>Text
s2) XML -> [XML] -> [XML]
forall a. a -> [a] -> [a]
: [XML]
xs) [XML]
bs
                           (XML, XML)
_ -> [XML] -> [XML] -> [XML]
flP (XML
yXML -> [XML] -> [XML]
forall a. a -> [a] -> [a]
:[XML]
xs) (XML
xXML -> [XML] -> [XML]
forall a. a -> [a] -> [a]
:[XML]
bs)
{-
instance (Monad m, Functor m) => IsAttrValue (RouteT url m) T.Text where
    toAttrValue = toAttrValue . T.unpack

instance (Monad m, Functor m) => IsAttrValue (RouteT url m) TL.Text where
    toAttrValue = toAttrValue . TL.unpack
-}
instance (Functor m, Monad m) => EmbedAsAttr (RouteT url m) Attribute where
    asAttr :: Attribute -> GenAttributeList (RouteT url m)
asAttr = [AttributeType (RouteT url m)] -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. Monad m => a -> m a
return ([AttributeType (RouteT url m)] -> GenAttributeList (RouteT url m))
-> (Attribute -> [AttributeType (RouteT url m)])
-> Attribute
-> GenAttributeList (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (AttributeType (RouteT url m)
-> [AttributeType (RouteT url m)] -> [AttributeType (RouteT url m)]
forall a. a -> [a] -> [a]
:[]) (AttributeType (RouteT url m) -> [AttributeType (RouteT url m)])
-> (Attribute -> AttributeType (RouteT url m))
-> Attribute
-> [AttributeType (RouteT url m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Attribute -> AttributeType (RouteT url m)
forall url (m :: * -> *). Attribute -> AttributeType (RouteT url m)
UAttr

instance (Functor m, Monad m) => EmbedAsAttr (RouteT url m) (Attr String Char) where
    asAttr :: Attr String Char -> GenAttributeList (RouteT url m)
asAttr (String
n := Char
c)  = Attr Text Text -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr (String -> Text
TL.pack String
n Text -> Text -> Attr Text Text
forall n a. n -> a -> Attr n a
:= Char -> Text
TL.singleton Char
c)

instance (Functor m, Monad m) => EmbedAsAttr (RouteT url m) (Attr String String) where
    asAttr :: Attr String String -> GenAttributeList (RouteT url m)
asAttr (String
n := String
str)  = Attribute -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr (Attribute -> GenAttributeList (RouteT url m))
-> Attribute -> GenAttributeList (RouteT url m)
forall a b. (a -> b) -> a -> b
$ (NSName, AttrValue) -> Attribute
MkAttr (Text -> NSName
forall n s. IsName n s => n -> Name s
toName (Text -> NSName) -> Text -> NSName
forall a b. (a -> b) -> a -> b
$ String -> Text
TL.pack String
n, Text -> AttrValue
pAttrVal (Text -> AttrValue) -> Text -> AttrValue
forall a b. (a -> b) -> a -> b
$ String -> Text
TL.pack String
str)

instance (Functor m, Monad m) => EmbedAsAttr (RouteT url m) (Attr TL.Text Bool) where
    asAttr :: Attr Text Bool -> GenAttributeList (RouteT url m)
asAttr (Text
n := Bool
True)  = Attribute -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr (Attribute -> GenAttributeList (RouteT url m))
-> Attribute -> GenAttributeList (RouteT url m)
forall a b. (a -> b) -> a -> b
$ (NSName, AttrValue) -> Attribute
MkAttr (Text -> NSName
forall n s. IsName n s => n -> Name s
toName Text
n, Text -> AttrValue
pAttrVal Text
"true")
    asAttr (Text
n := Bool
False) = Attribute -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr (Attribute -> GenAttributeList (RouteT url m))
-> Attribute -> GenAttributeList (RouteT url m)
forall a b. (a -> b) -> a -> b
$ (NSName, AttrValue) -> Attribute
MkAttr (Text -> NSName
forall n s. IsName n s => n -> Name s
toName Text
n, Text -> AttrValue
pAttrVal Text
"false")

instance (Functor m, Monad m) => EmbedAsAttr (RouteT url m) (Attr TL.Text Int) where
    asAttr :: Attr Text Int -> GenAttributeList (RouteT url m)
asAttr (Text
n := Int
i)  = Attribute -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr (Attribute -> GenAttributeList (RouteT url m))
-> Attribute -> GenAttributeList (RouteT url m)
forall a b. (a -> b) -> a -> b
$ (NSName, AttrValue) -> Attribute
MkAttr (Text -> NSName
forall n s. IsName n s => n -> Name s
toName Text
n, Text -> AttrValue
pAttrVal (String -> Text
TL.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
i))

instance (Functor m, Monad m) => EmbedAsAttr (RouteT url m) (Attr TL.Text Integer) where
    asAttr :: Attr Text Integer -> GenAttributeList (RouteT url m)
asAttr (Text
n := Integer
i)  = Attribute -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr (Attribute -> GenAttributeList (RouteT url m))
-> Attribute -> GenAttributeList (RouteT url m)
forall a b. (a -> b) -> a -> b
$ (NSName, AttrValue) -> Attribute
MkAttr (Text -> NSName
forall n s. IsName n s => n -> Name s
toName Text
n, Text -> AttrValue
pAttrVal (String -> Text
TL.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Integer -> String
forall a. Show a => a -> String
show Integer
i))

instance (Monad m, Functor m, IsName n TL.Text) => (EmbedAsAttr (RouteT url m) (Attr n TL.Text)) where
    asAttr :: Attr n Text -> GenAttributeList (RouteT url m)
asAttr (n
n := Text
a) = Attribute -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr (Attribute -> GenAttributeList (RouteT url m))
-> Attribute -> GenAttributeList (RouteT url m)
forall a b. (a -> b) -> a -> b
$ (NSName, AttrValue) -> Attribute
MkAttr (n -> NSName
forall n s. IsName n s => n -> Name s
toName n
n, Text -> AttrValue
pAttrVal Text
a)

instance (Monad m, Functor m, IsName n TL.Text) => (EmbedAsAttr (RouteT url m) (Attr n T.Text)) where
    asAttr :: Attr n Text -> GenAttributeList (RouteT url m)
asAttr (n
n := Text
a) = Attribute -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr (Attribute -> GenAttributeList (RouteT url m))
-> Attribute -> GenAttributeList (RouteT url m)
forall a b. (a -> b) -> a -> b
$ (NSName, AttrValue) -> Attribute
MkAttr (n -> NSName
forall n s. IsName n s => n -> Name s
toName n
n, Text -> AttrValue
pAttrVal (Text -> AttrValue) -> Text -> AttrValue
forall a b. (a -> b) -> a -> b
$ Text -> Text
TL.fromStrict Text
a)

instance (Functor m, Monad m) => EmbedAsAttr (RouteT url m) (Attr TL.Text url) where
    asAttr :: Attr Text url -> GenAttributeList (RouteT url m)
asAttr (Text
n := url
u) =
        do Text
url <- URL (XMLGenT (RouteT url m)) -> XMLGenT (RouteT url m) Text
forall (m :: * -> *). MonadRoute m => URL m -> m Text
showURL url
URL (XMLGenT (RouteT url m))
u
           Attribute -> GenAttributeList (RouteT url m)
forall (m :: * -> *) a. EmbedAsAttr m a => a -> GenAttributeList m
asAttr (Attribute -> GenAttributeList (RouteT url m))
-> Attribute -> GenAttributeList (RouteT url m)
forall a b. (a -> b) -> a -> b
$ (NSName, AttrValue) -> Attribute
MkAttr (Text -> NSName
forall n s. IsName n s => n -> Name s
toName Text
n, Text -> AttrValue
pAttrVal (Text -> Text
TL.fromStrict Text
url))

instance (Functor m, Monad m) => EmbedAsChild (RouteT url m) Char where
    asChild :: Char -> GenChildList (RouteT url m)
asChild = RouteT url m [ChildType (RouteT url m)]
-> GenChildList (RouteT url m)
forall (m :: * -> *) a. m a -> XMLGenT m a
XMLGenT (RouteT url m [ChildType (RouteT url m)]
 -> GenChildList (RouteT url m))
-> (Char -> RouteT url m [ChildType (RouteT url m)])
-> Char
-> GenChildList (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ChildType (RouteT url m)]
-> RouteT url m [ChildType (RouteT url m)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([ChildType (RouteT url m)]
 -> RouteT url m [ChildType (RouteT url m)])
-> (Char -> [ChildType (RouteT url m)])
-> Char
-> RouteT url m [ChildType (RouteT url m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChildType (RouteT url m)
-> [ChildType (RouteT url m)] -> [ChildType (RouteT url m)]
forall a. a -> [a] -> [a]
:[]) (ChildType (RouteT url m) -> [ChildType (RouteT url m)])
-> (Char -> ChildType (RouteT url m))
-> Char
-> [ChildType (RouteT url m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XML -> ChildType (RouteT url m)
forall url (m :: * -> *). XML -> ChildType (RouteT url m)
UChild (XML -> ChildType (RouteT url m))
-> (Char -> XML) -> Char -> ChildType (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> XML
pcdata (Text -> XML) -> (Char -> Text) -> Char -> XML
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Text
TL.singleton

instance (Functor m, Monad m) => EmbedAsChild (RouteT url m) String where
    asChild :: String -> GenChildList (RouteT url m)
asChild = RouteT url m [ChildType (RouteT url m)]
-> GenChildList (RouteT url m)
forall (m :: * -> *) a. m a -> XMLGenT m a
XMLGenT (RouteT url m [ChildType (RouteT url m)]
 -> GenChildList (RouteT url m))
-> (String -> RouteT url m [ChildType (RouteT url m)])
-> String
-> GenChildList (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ChildType (RouteT url m)]
-> RouteT url m [ChildType (RouteT url m)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([ChildType (RouteT url m)]
 -> RouteT url m [ChildType (RouteT url m)])
-> (String -> [ChildType (RouteT url m)])
-> String
-> RouteT url m [ChildType (RouteT url m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChildType (RouteT url m)
-> [ChildType (RouteT url m)] -> [ChildType (RouteT url m)]
forall a. a -> [a] -> [a]
:[]) (ChildType (RouteT url m) -> [ChildType (RouteT url m)])
-> (String -> ChildType (RouteT url m))
-> String
-> [ChildType (RouteT url m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XML -> ChildType (RouteT url m)
forall url (m :: * -> *). XML -> ChildType (RouteT url m)
UChild (XML -> ChildType (RouteT url m))
-> (String -> XML) -> String -> ChildType (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> XML
pcdata (Text -> XML) -> (String -> Text) -> String -> XML
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
TL.pack

instance (Monad m, Functor m) => (EmbedAsChild (RouteT url m) TL.Text) where
    asChild :: Text -> GenChildList (RouteT url m)
asChild = RouteT url m [ChildType (RouteT url m)]
-> GenChildList (RouteT url m)
forall (m :: * -> *) a. m a -> XMLGenT m a
XMLGenT (RouteT url m [ChildType (RouteT url m)]
 -> GenChildList (RouteT url m))
-> (Text -> RouteT url m [ChildType (RouteT url m)])
-> Text
-> GenChildList (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ChildType (RouteT url m)]
-> RouteT url m [ChildType (RouteT url m)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([ChildType (RouteT url m)]
 -> RouteT url m [ChildType (RouteT url m)])
-> (Text -> [ChildType (RouteT url m)])
-> Text
-> RouteT url m [ChildType (RouteT url m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChildType (RouteT url m)
-> [ChildType (RouteT url m)] -> [ChildType (RouteT url m)]
forall a. a -> [a] -> [a]
:[]) (ChildType (RouteT url m) -> [ChildType (RouteT url m)])
-> (Text -> ChildType (RouteT url m))
-> Text
-> [ChildType (RouteT url m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XML -> ChildType (RouteT url m)
forall url (m :: * -> *). XML -> ChildType (RouteT url m)
UChild (XML -> ChildType (RouteT url m))
-> (Text -> XML) -> Text -> ChildType (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> XML
pcdata

instance (Monad m, Functor m) => (EmbedAsChild (RouteT url m) T.Text) where
    asChild :: Text -> GenChildList (RouteT url m)
asChild = Text -> GenChildList (RouteT url m)
forall (m :: * -> *) c. EmbedAsChild m c => c -> GenChildList m
asChild (Text -> GenChildList (RouteT url m))
-> (Text -> Text) -> Text -> GenChildList (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
TL.fromStrict

instance (Functor m, Monad m) => EmbedAsChild (RouteT url m) XML where
    asChild :: XML -> GenChildList (RouteT url m)
asChild = RouteT url m [ChildType (RouteT url m)]
-> GenChildList (RouteT url m)
forall (m :: * -> *) a. m a -> XMLGenT m a
XMLGenT (RouteT url m [ChildType (RouteT url m)]
 -> GenChildList (RouteT url m))
-> (XML -> RouteT url m [ChildType (RouteT url m)])
-> XML
-> GenChildList (RouteT url m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ChildType (RouteT url m)]
-> RouteT url m [ChildType (RouteT url m)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([ChildType (RouteT url m)]
 -> RouteT url m [ChildType (RouteT url m)])
-> (XML -> [ChildType (RouteT url m)])
-> XML
-> RouteT url m [ChildType (RouteT url m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChildType (RouteT url m)
-> [ChildType (RouteT url m)] -> [ChildType (RouteT url m)]
forall a. a -> [a] -> [a]
:[]) (ChildType (RouteT url m) -> [ChildType (RouteT url m)])
-> (XML -> ChildType (RouteT url m))
-> XML
-> [ChildType (RouteT url m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XML -> ChildType (RouteT url m)
forall url (m :: * -> *). XML -> ChildType (RouteT url m)
UChild

instance (Functor m, Monad m) => EmbedAsChild (RouteT url m) () where
  asChild :: () -> GenChildList (RouteT url m)
asChild () = [ChildType (RouteT url m)] -> GenChildList (RouteT url m)
forall (m :: * -> *) a. Monad m => a -> m a
return []

instance (Functor m, Monad m) => AppendChild (RouteT url m) XML where
 appAll :: XML -> GenChildList (RouteT url m) -> GenXML (RouteT url m)
appAll XML
xml GenChildList (RouteT url m)
children = do
        [ChildType (RouteT url m)]
chs <- GenChildList (RouteT url m)
children
        case XML
xml of
         CDATA Bool
_ Text
_       -> XML -> XMLGenT (RouteT url m) XML
forall (m :: * -> *) a. Monad m => a -> m a
return XML
xml
         Element NSName
n [Attribute]
as [XML]
cs -> XML -> XMLGenT (RouteT url m) XML
forall (m :: * -> *) a. Monad m => a -> m a
return (XML -> XMLGenT (RouteT url m) XML)
-> XML -> XMLGenT (RouteT url m) XML
forall a b. (a -> b) -> a -> b
$ NSName -> [Attribute] -> [XML] -> XML
Element NSName
n [Attribute]
as ([XML]
cs [XML] -> [XML] -> [XML]
forall a. [a] -> [a] -> [a]
++ ((ChildType (RouteT url m) -> XML)
-> [ChildType (RouteT url m)] -> [XML]
forall a b. (a -> b) -> [a] -> [b]
map ChildType (RouteT url m) -> XML
forall url (m :: * -> *). ChildType (RouteT url m) -> XML
unUChild [ChildType (RouteT url m)]
chs))

instance (Functor m, Monad m) => SetAttr (RouteT url m) XML where
 setAll :: XML -> GenAttributeList (RouteT url m) -> GenXML (RouteT url m)
setAll XML
xml GenAttributeList (RouteT url m)
hats = do
        [AttributeType (RouteT url m)]
attrs <- GenAttributeList (RouteT url m)
hats
        case XML
xml of
         CDATA Bool
_ Text
_       -> XML -> XMLGenT (RouteT url m) XML
forall (m :: * -> *) a. Monad m => a -> m a
return XML
xml
         Element NSName
n [Attribute]
as [XML]
cs -> XML -> XMLGenT (RouteT url m) XML
forall (m :: * -> *) a. Monad m => a -> m a
return (XML -> XMLGenT (RouteT url m) XML)
-> XML -> XMLGenT (RouteT url m) XML
forall a b. (a -> b) -> a -> b
$ NSName -> [Attribute] -> [XML] -> XML
Element NSName
n ((Attribute -> [Attribute] -> [Attribute])
-> [Attribute] -> [Attribute] -> [Attribute]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (:) [Attribute]
as ((AttributeType (RouteT url m) -> Attribute)
-> [AttributeType (RouteT url m)] -> [Attribute]
forall a b. (a -> b) -> [a] -> [b]
map AttributeType (RouteT url m) -> Attribute
forall url (m :: * -> *). AttributeType (RouteT url m) -> Attribute
unUAttr [AttributeType (RouteT url m)]
attrs)) [XML]
cs

instance (Functor m, Monad m) => XMLGenerator (RouteT url m)

instance (MonadRoute m) => MonadRoute (XMLGenT m) where
    type URL (XMLGenT m) = URL m
    askRouteFn :: XMLGenT m (URL (XMLGenT m) -> [(Text, Maybe Text)] -> Text)
askRouteFn = m (URL m -> [(Text, Maybe Text)] -> Text)
-> XMLGenT m (URL m -> [(Text, Maybe Text)] -> Text)
forall (m :: * -> *) a. m a -> XMLGenT m a
XMLGenT m (URL m -> [(Text, Maybe Text)] -> Text)
forall (m :: * -> *).
MonadRoute m =>
m (URL m -> [(Text, Maybe Text)] -> Text)
askRouteFn