module DDC.Core.Fragment.Profile
( Profile (..)
, zeroProfile
, Features(..)
, zeroFeatures
, setFeature)
where
import DDC.Core.Fragment.Feature
import DDC.Type.DataDef
import DDC.Type.Exp
import DDC.Type.Env (KindEnv, TypeEnv)
import qualified DDC.Type.Env as Env
data Profile n
= Profile
{
profileName :: !String
, profileFeatures :: !Features
, profilePrimDataDefs :: !(DataDefs n)
, profilePrimKinds :: !(KindEnv n)
, profilePrimTypes :: !(TypeEnv n)
, profileTypeIsUnboxed :: !(Type n -> Bool)
, profileNameIsHole :: !(Maybe (n -> Bool)) }
zeroProfile :: Profile n
zeroProfile
= Profile
{ profileName = "Zero"
, profileFeatures = zeroFeatures
, profilePrimDataDefs = emptyDataDefs
, profilePrimKinds = Env.empty
, profilePrimTypes = Env.empty
, profileTypeIsUnboxed = const False
, profileNameIsHole = Nothing }
data Features
= Features
{ featuresTrackedEffects :: Bool
, featuresTrackedClosures :: Bool
, featuresFunctionalEffects :: Bool
, featuresFunctionalClosures :: Bool
, featuresEffectCapabilities :: Bool
, featuresPartialPrims :: Bool
, featuresPartialApplication :: Bool
, featuresGeneralApplication :: Bool
, featuresNestedFunctions :: Bool
, featuresDebruijnBinders :: Bool
, featuresUnboundLevel0Vars :: Bool
, featuresUnboxedInstantiation :: Bool
, featuresNameShadowing :: Bool
, featuresUnusedBindings :: Bool
, featuresUnusedMatches :: Bool
}
zeroFeatures :: Features
zeroFeatures
= Features
{ featuresTrackedEffects = False
, featuresTrackedClosures = False
, featuresFunctionalEffects = False
, featuresFunctionalClosures = False
, featuresEffectCapabilities = False
, featuresPartialPrims = False
, featuresPartialApplication = False
, featuresGeneralApplication = False
, featuresNestedFunctions = False
, featuresDebruijnBinders = False
, featuresUnboundLevel0Vars = False
, featuresUnboxedInstantiation = False
, featuresNameShadowing = False
, featuresUnusedBindings = False
, featuresUnusedMatches = False }
setFeature :: Feature -> Bool -> Features -> Features
setFeature feature val features
= case feature of
TrackedEffects -> features { featuresTrackedEffects = val }
TrackedClosures -> features { featuresTrackedClosures = val }
FunctionalEffects -> features { featuresFunctionalEffects = val }
FunctionalClosures -> features { featuresFunctionalClosures = val }
EffectCapabilities -> features { featuresEffectCapabilities = val }
PartialPrims -> features { featuresPartialPrims = val }
PartialApplication -> features { featuresPartialApplication = val }
GeneralApplication -> features { featuresGeneralApplication = val }
NestedFunctions -> features { featuresNestedFunctions = val }
DebruijnBinders -> features { featuresDebruijnBinders = val }
UnboundLevel0Vars -> features { featuresUnboundLevel0Vars = val }
UnboxedInstantiation -> features { featuresUnboxedInstantiation = val }
NameShadowing -> features { featuresNameShadowing = val }
UnusedBindings -> features { featuresUnusedBindings = val }
UnusedMatches -> features { featuresUnusedMatches = val }