{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FunctionalDependencies, FlexibleContexts, FlexibleInstances, UndecidableInstances, TypeSynonymInstances, GeneralizedNewtypeDeriving  #-}
module XMLGenerator where

class Monad m => XMLGen m where
 type XML m
 data Child m
 genElement  :: String ->XMLGenT m (XML m)
 xmlToChild :: XML m -> Child m

newtype XMLGenT m a = XMLGenT (m a)
    deriving (Monad, Functor)

class XMLGen m => EmbedAsChild m c where
 asChild :: c -> XMLGenT m [Child m]

instance (EmbedAsChild m c, m1 ~ m) => EmbedAsChild m (XMLGenT m1 c) where
 asChild m = asChild =<< m

instance (XMLGen m,  XML m ~ x) => EmbedAsChild m x where
 asChild = return . return . xmlToChild
