packages feed

hoop-0.3.0.0: src/Language/MSH/CodeGen/Monad.hs

module Language.MSH.CodeGen.Monad (
    genStateType
) where

import Language.Haskell.TH
import Language.Haskell.TH.Syntax

import Language.MSH.StateDecl
import Language.MSH.CodeGen.Shared
import Language.MSH.CodeGen.Interop

import Debug.Trace

--stateName = name, stateParams = vars, stateParentN = mp
genStateType :: [TyVarBndr] -> StateDecl -> Q Dec
genStateType tyvars (StateDecl {..}) = do
    let
        -- unlike in the paper, the type synonym isn't just the name of the class
        tname = mkName $ stateName ++ "M"
        stype = appN (ConT (mkName $ stateName ++ "State")) stateParams
    case stateParentN of
        Nothing  -> return $
            TySynD tname tyvars (AppT (ConT (mkName "State")) stype)
        (Just p) -> do
            let
                ptype = appN (parseType p) stateParentPs
                -- we want the monad, not the object
                fixpt t@(ConT _) = renameT (\n -> n ++ "M") t
                fixpt (AppT f a) = AppT (fixpt f) a
            trace (show stateParentPs ++ show ptype) $ return $ TySynD tname tyvars (AppT (AppT (ConT (mkName "StateT")) stype) (fixpt ptype))