module DDC.Build.Language.Salt
( language
, bundle
, fragment
, freshT
, freshX)
where
import DDC.Build.Language.Base
import DDC.Core.Simplifier
import DDC.Core.Transform.Namify
import DDC.Core.Fragment
import DDC.Type.Exp
import DDC.Type.Env (Env)
import qualified DDC.Core.Salt as A
import qualified DDC.Type.Env as Env
import qualified Data.Map as Map
import Control.Monad.State.Strict
language :: Language
language = Language bundle
bundle :: Bundle Int A.Name A.Error
bundle = Bundle
{ bundleFragment = fragment
, bundleModules = Map.empty
, bundleStateInit = 0 :: Int
, bundleSimplifier = Trans Id
, bundleMakeNamifierT = makeNamifier freshT
, bundleMakeNamifierX = makeNamifier freshX
, bundleRewriteRules = Map.empty }
fragment :: Fragment A.Name A.Error
fragment
= Fragment
{ fragmentProfile = A.profile
, fragmentExtension = "dcs"
, fragmentReadName = A.readName
, fragmentLexModule = A.lexModuleString
, fragmentLexExp = A.lexExpString
, fragmentCheckModule = const Nothing
, fragmentCheckExp = const Nothing }
freshT :: Env A.Name -> Bind A.Name -> State Int A.Name
freshT env bb
= do i <- get
put (i + 1)
let n = A.NameVar ("t" ++ show i)
case Env.lookupName n env of
Nothing -> return n
_ -> freshT env bb
freshX :: Env A.Name -> Bind A.Name -> State Int A.Name
freshX env bb
= do i <- get
put (i + 1)
let n = A.NameVar ("x" ++ show i)
case Env.lookupName n env of
Nothing -> return n
_ -> freshX env bb