module DDC.Core.DaCon
( DaCon (..)
, DaConName (..)
, dcUnit
, mkDaConAlg
, mkDaConSolid
, takeNameOfDaCon
, typeOfDaCon)
where
import DDC.Type.Compounds
import DDC.Type.Exp
import Control.DeepSeq
data DaConName n
= DaConUnit
| DaConNamed n
deriving (Eq, Show)
instance NFData n => NFData (DaConName n) where
rnf dcn
= case dcn of
DaConUnit -> ()
DaConNamed n -> rnf n
data DaCon n
= DaCon
{
daConName :: !(DaConName n)
, daConType :: !(Type n)
, daConIsAlgebraic :: !Bool }
deriving Show
instance NFData n => NFData (DaCon n) where
rnf !dc
= rnf (daConName dc)
`seq` rnf (daConType dc)
`seq` rnf (daConIsAlgebraic dc)
takeNameOfDaCon :: DaCon n -> Maybe n
takeNameOfDaCon dc
= case daConName dc of
DaConUnit -> Nothing
DaConNamed n -> Just n
typeOfDaCon :: DaCon n -> Type n
typeOfDaCon dc = daConType dc
dcUnit :: DaCon n
dcUnit = DaCon
{ daConName = DaConUnit
, daConType = tUnit
, daConIsAlgebraic = True }
mkDaConAlg :: n -> Type n -> DaCon n
mkDaConAlg n t
= DaCon
{ daConName = DaConNamed n
, daConType = t
, daConIsAlgebraic = True }
mkDaConSolid :: n -> Type n -> DaCon n
mkDaConSolid n t
= DaCon
{ daConName = DaConNamed n
, daConType = t
, daConIsAlgebraic = False }