module Language.MSH.StateDecl (
module Language.MSH.MethodTable,
StateMod(..),
StateObjCtr(..),
StateMemberDecl(..),
StateDecl(..),
isBaseClass,
isAbstractClass,
isFinalClass,
ctrsForClass
) where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import Language.MSH.MethodTable
data StateMod = Abstract | Final deriving Show
data StateObjCtr = DataCtr | StartCtr | MiddleCtr | EndCtr deriving Show
data StateMemberDecl = StateDataDecl {
stateDataName :: String,
stateDataExpr :: Maybe String,
stateDataType :: String
} deriving Show
data StateDecl = StateDecl {
stateMod :: Maybe StateMod,
stateName :: String,
stateParams :: [String],
stateParentN :: Maybe String,
stateParent :: Maybe StateDecl,
stateData :: [StateMemberDecl],
stateBody :: [Dec],
stateMethods :: MethodTable
} deriving Show
isBaseClass :: StateDecl -> Bool
isBaseClass (StateDecl { stateParentN = Nothing } ) = True
isBaseClass _ = False
isAbstractClass :: StateDecl -> Bool
isAbstractClass (StateDecl { stateMod = Just Abstract }) = True
isAbstractClass _ = False
isFinalClass :: StateDecl -> Bool
isFinalClass (StateDecl { stateMod = Just Final }) = True
isFinalClass _ = False
ctrsForClass :: StateDecl -> [StateObjCtr]
ctrsForClass (StateDecl { stateParentN = p, stateMod = m }) = case p of
Nothing -> case m of
Nothing -> [DataCtr, StartCtr]
(Just Abstract) -> [StartCtr]
(Just Final) -> [DataCtr]
(Just _) -> case m of
Nothing -> [DataCtr, StartCtr, MiddleCtr, EndCtr]
(Just Abstract) -> [StartCtr, MiddleCtr]
(Just Final) -> [DataCtr, EndCtr]