-- | The `Tetra` fragment has four base kinds: 
--   `Data`, `Region`, `Effect`, `Witness` and uses the `S`
--   computation type to represent effects.
module DDC.Build.Language.Tetra
        ( language
        , bundle
        , fragment

        , Error (..))
where
import DDC.Build.Language.Base
import DDC.Core.Simplifier
import DDC.Core.Transform.Namify
import DDC.Core.Fragment                hiding (Error(..))
import DDC.Core.Tetra                   as Tetra
import DDC.Core.Tetra.Profile           as Tetra
import DDC.Base.Pretty
import qualified Data.Map               as Map


-- | Language definition for Disciple Core Tetra.
language    :: Language
language    = Language bundle


-- | Language bundle for Disciple Core Tetra.
bundle  :: Bundle Int Name Error
bundle
        = Bundle
        { bundleFragment        = fragment
        , bundleModules         = Map.empty
        , bundleStateInit       = 0 :: Int
        , bundleSimplifier      = Trans Id
        , bundleMakeNamifierT   = makeNamifier freshT 
        , bundleMakeNamifierX   = makeNamifier freshX 
        , bundleRewriteRules    = Map.empty }


-- | Fragement definition for Disciple Core Tetra.
fragment :: Fragment Name Error
fragment
        = Fragment
        { fragmentProfile       = profile 
        , fragmentExtension     = "dct"
        , fragmentReadName      = readName
        , fragmentLexModule     = lexModuleString
        , fragmentLexExp        = lexExpString
        , fragmentCheckModule   = const Nothing
        , fragmentCheckExp      = const Nothing }


data Error a
        = Error
        deriving Show

instance Pretty (Error a) where
 ppr Error  = text (show Error)