-- | Language profile for Disciple Core Lite.
module DDC.Core.Lite.Profile
        ( profile
        , lexModuleString
        , lexExpString)
where
import DDC.Core.Lite.Env
import DDC.Core.Lite.Name
import DDC.Core.Fragment
import DDC.Core.Lexer
import DDC.Data.Token


-- | Profile for Disciple Core Lite.
profile :: Profile Name 
profile
        = Profile
        { profileName                   = "Lite"
        , profileFeatures               = features
        , profilePrimDataDefs           = primDataDefs
        , profilePrimKinds              = primKindEnv
        , profilePrimTypes              = primTypeEnv
        , profileTypeIsUnboxed          = const False 
        , profileNameIsHole             = Nothing }


features :: Features
features 
        = Features
        { featuresTrackedEffects        = True
        , featuresTrackedClosures       = True
        , featuresFunctionalEffects     = True
        , featuresFunctionalClosures    = True
        , featuresEffectCapabilities    = False
        , featuresPartialPrims          = False
        , featuresPartialApplication    = True
        , featuresGeneralApplication    = True
        , featuresNestedFunctions       = True
        , featuresDebruijnBinders       = True
        , featuresUnboundLevel0Vars     = False

          -- We allow unboxed instantiation in Lite, though all all
          -- polymorphic functions applied to unboxed types will need
          -- to be specialised before Salt will accept the code.
        , featuresUnboxedInstantiation  = True

        , featuresNameShadowing         = False
        , featuresUnusedBindings        = True
        , featuresUnusedMatches         = False }


-- | Lex a string to tokens, using primitive names.
--
--   The first argument gives the starting source line number.
lexModuleString :: String -> Int -> String -> [Token (Tok Name)]
lexModuleString sourceName lineStart str
 = map rn $ lexModuleWithOffside sourceName lineStart str
 where rn (Token strTok sp) 
        = case renameTok readName strTok of
                Just t' -> Token t' sp
                Nothing -> Token (KJunk "lexical error") sp


-- | Lex a string to tokens, using primitive names.
--
--   The first argument gives the starting source line number.
lexExpString :: String -> Int -> String -> [Token (Tok Name)]
lexExpString sourceName lineStart str
 = map rn $ lexExp sourceName lineStart str
 where rn (Token strTok sp) 
        = case renameTok readName strTok of
                Just t' -> Token t' sp
                Nothing -> Token (KJunk "lexical error") sp