module HSP.Monad where
import Control.Applicative (Applicative, Alternative, (<$>))
import Control.Monad (MonadPlus)
import Control.Monad.Cont (MonadCont)
import Control.Monad.Error (MonadError)
import Control.Monad.Fix (MonadFix)
import Control.Monad.Reader (MonadReader)
import Control.Monad.Writer (MonadWriter)
import Control.Monad.State (MonadState)
import Control.Monad.Trans (MonadIO, MonadTrans(lift))
import Data.String (fromString)
import qualified Data.Text as Strict
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as Lazy
import HSP.XMLGenerator (AppendChild(..), Attr(..), EmbedAsAttr(..), EmbedAsChild(..), IsName(..), SetAttr(..), XMLGen(..), XMLGenerator)
import HSP.XML (Attribute(..), XML(..), AttrValue(..), pAttrVal, pcdata)
newtype HSPT xml m a = HSPT { unHSPT :: m a }
deriving (Functor, Applicative, Alternative, Monad, MonadPlus, MonadIO, MonadReader r, MonadWriter w, MonadState s, MonadCont, MonadError e, MonadFix)
instance MonadTrans (HSPT xml) where
lift = HSPT
instance (Functor m, Monad m) => (XMLGen (HSPT XML m)) where
type XMLType (HSPT XML m) = XML
type StringType (HSPT XML m) = Text
newtype ChildType (HSPT XML m) = HSPChild { unHSPChild :: XML }
newtype AttributeType (HSPT XML m) = HSPAttr { unHSPAttr :: Attribute }
genElement n attrs childr =
do as <- (map unHSPAttr . concat) <$> sequence attrs
cs <- (map unHSPChild . concat) <$> sequence childr
return (Element n as cs)
xmlToChild = HSPChild
pcdataToChild str = HSPChild (pcdata str)
instance (Functor m, Monad m) => SetAttr (HSPT XML m) XML where
setAll xml hats =
do attrs <- hats
case xml of
CDATA _ _ -> return xml
Element n as cs -> return $ Element n (foldr (:) as (map unHSPAttr attrs)) cs
instance (Functor m, Monad m) => AppendChild (HSPT XML m) XML where
appAll xml children =
do chs <- children
case xml of
CDATA _ _ -> return xml
Element n as cs -> return $ Element n as (cs ++ (map unHSPChild chs))
instance (Functor m, Monad m) => EmbedAsChild (HSPT XML m) XML where
asChild = return . (:[]) . HSPChild
instance (Functor m, Monad m) => EmbedAsChild (HSPT XML m) [XML] where
asChild = return . map HSPChild
instance (Functor m, Monad m) => EmbedAsChild (HSPT XML m) String where
asChild = return . (:[]) . HSPChild . pcdata . Lazy.pack
instance (Functor m, Monad m) => EmbedAsChild (HSPT XML m) Text where
asChild = return . (:[]) . HSPChild . pcdata
instance (Functor m, Monad m) => EmbedAsChild (HSPT XML m) Strict.Text where
asChild = return . (:[]) . HSPChild . pcdata . Lazy.fromStrict
instance (Functor m, Monad m) => EmbedAsChild (HSPT XML m) Char where
asChild = return . (:[]) . pcdataToChild . Lazy.singleton
instance (Functor m, Monad m) => EmbedAsChild (HSPT XML m) () where
asChild = return . const []
instance (Monad m, Functor m) => EmbedAsAttr (HSPT XML m) Attribute where
asAttr = return . (:[]) . HSPAttr
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Text Text) where
asAttr (n := v) = asAttr $ MkAttr (toName n, (pAttrVal v))
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Strict.Text Text) where
asAttr (n := v) = asAttr $ MkAttr (toName n, (pAttrVal v))
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Strict.Text Strict.Text) where
asAttr (n := v) = asAttr $ MkAttr (toName n, (pAttrVal $ Lazy.fromStrict v))
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Text Strict.Text) where
asAttr (n := v) = asAttr $ MkAttr (toName n, (pAttrVal $ Lazy.fromStrict v))
instance (Monad m, Functor m) => EmbedAsAttr (HSPT XML m) (Attr Text Char) where
asAttr (n := c) = asAttr (n := Lazy.singleton c)
instance (Monad m, Functor m) => EmbedAsAttr (HSPT XML m) (Attr Strict.Text Char) where
asAttr (n := c) = asAttr $ MkAttr (toName n, pAttrVal $ Lazy.singleton c)
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Text Bool) where
asAttr (n := True) = asAttr $ MkAttr (toName n, pAttrVal $ fromString "true")
asAttr (n := False) = asAttr $ MkAttr (toName n, pAttrVal $ fromString "false")
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Strict.Text Bool) where
asAttr (n := True) = asAttr $ MkAttr (toName n, pAttrVal $ fromString "true")
asAttr (n := False) = asAttr $ MkAttr (toName n, pAttrVal $ fromString "false")
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Text Int) where
asAttr (n := i) = asAttr $ MkAttr (toName n, pAttrVal $ fromString (show i))
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Strict.Text Int) where
asAttr (n := i) = asAttr $ MkAttr (toName n, pAttrVal $ fromString (show i))
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Text ()) where
asAttr (n := ()) = asAttr $ MkAttr (toName n, NoValue)
instance (Functor m, Monad m) => EmbedAsAttr (HSPT XML m) (Attr Strict.Text ()) where
asAttr (n := ()) = asAttr $ MkAttr (toName n, NoValue)
instance (Functor m, Monad m) => XMLGenerator (HSPT XML m)