module DDC.Source.Tetra.DataDef
(
DataDef (..)
, typeEnvOfDataDef
, DataCtor (..)
, typeOfDataCtor)
where
import DDC.Type.Compounds
import DDC.Type.Exp
import DDC.Type.Env (TypeEnv)
import qualified DDC.Type.Env as Env
import Control.DeepSeq
data DataDef n
= DataDef
{
dataDefTypeName :: !n
, dataDefParams :: [Bind n]
, dataDefCtors :: [DataCtor n] }
deriving Show
instance NFData (DataDef n)
typeEnvOfDataDef :: Ord n => DataDef n -> TypeEnv n
typeEnvOfDataDef def
= Env.fromList
[BName (dataCtorName ctor)
(typeOfDataCtor def ctor)
| ctor <- dataDefCtors def ]
data DataCtor n
= DataCtor
{
dataCtorName :: !n
, dataCtorFieldTypes :: ![Type n]
, dataCtorResultType :: !(Type n) }
deriving Show
instance NFData (DataCtor n)
typeOfDataCtor :: DataDef n -> DataCtor n -> Type n
typeOfDataCtor def ctor
= foldr TForall
(foldr tFun (dataCtorResultType ctor)
(dataCtorFieldTypes ctor))
(dataDefParams def)