ddc-core-0.4.3.1: DDC/Core/Check/Config.hs
module DDC.Core.Check.Config
( Config (..)
, configOfProfile)
where
import DDC.Type.DataDef
import DDC.Type.Env (KindEnv, TypeEnv)
import qualified DDC.Core.Fragment as F
-- Config ---------------------------------------------------------------------
-- | Static configuration for the type checker.
-- These fields don't change as we decend into the tree.
--
-- The starting configuration should be converted from the profile that
-- defines the language fragment you are checking.
-- See "DDC.Core.Fragment" and use `configOfProfile` below.
data Config n
= Config
{ -- | Kinds of primitive types.
configPrimKinds :: KindEnv n
-- | Types of primitive operators.
, configPrimTypes :: TypeEnv n
-- | Data type definitions.
, configPrimDataDefs :: DataDefs n
-- | This name represents some hole in the expression that needs
-- to be filled in by the type checker.
, configNameIsHole :: Maybe (n -> Bool)
-- | Track effect type information.
, configTrackedEffects :: Bool
-- | Track closure type information.
, configTrackedClosures :: Bool
-- | Attach effect information to function types.
, configFunctionalEffects :: Bool
-- | Attach closure information to function types.
, configFunctionalClosures :: Bool
-- | Treat effects as capabilities.
, configEffectCapabilities :: Bool
-- | Allow general let-rec
, configGeneralLetRec :: Bool
-- | Automatically run effectful applications.
, configImplicitRun :: Bool
-- | Automatically box bodies of abstractions.
, configImplicitBox :: Bool
}
-- | Convert a language profile to a type checker configuration.
configOfProfile :: F.Profile n -> Config n
configOfProfile profile
= let features = F.profileFeatures profile
in Config
{ configPrimKinds = F.profilePrimKinds profile
, configPrimTypes = F.profilePrimTypes profile
, configPrimDataDefs = F.profilePrimDataDefs profile
, configNameIsHole = F.profileNameIsHole profile
, configTrackedEffects = F.featuresTrackedEffects features
, configTrackedClosures = F.featuresTrackedClosures features
, configFunctionalEffects = F.featuresFunctionalEffects features
, configFunctionalClosures = F.featuresFunctionalClosures features
, configEffectCapabilities = F.featuresEffectCapabilities features
, configGeneralLetRec = F.featuresGeneralLetRec features
, configImplicitRun = F.featuresImplicitRun features
, configImplicitBox = F.featuresImplicitBox features
}