ddc-source-tetra-0.4.2.1: DDC/Source/Tetra/Module.hs
{-# LANGUAGE UndecidableInstances #-}
-- | Definition of Source Tetra modules.
module DDC.Source.Tetra.Module
( -- * Modules
Module (..)
, isMainModule
, ExportSource (..)
, ImportType (..)
, ImportCap (..)
, ImportValue (..)
-- * Module Names
, QualName (..)
, ModuleName (..)
, isMainModuleName
-- * Top-level things
, Top (..)
-- * Data type definitions
, DataDef (..))
where
import DDC.Source.Tetra.Exp
import DDC.Source.Tetra.DataDef
import Control.DeepSeq
import DDC.Core.Module
( QualName (..)
, ModuleName (..)
, isMainModuleName
, ExportSource (..)
, ImportType (..)
, ImportCap (..)
, ImportValue (..))
-- Module ---------------------------------------------------------------------
data Module l
= Module
{ -- | Name of this module
moduleName :: !ModuleName
-- Exports ----------------------------
-- | Names of exported types (level-1).
, moduleExportTypes :: [GName l]
-- | Names of exported values (level-0).
, moduleExportValues :: [GName l]
-- Imports ----------------------------
-- | Imported modules.
, moduleImportModules :: [ModuleName]
-- | Kinds of imported foreign types.
, moduleImportTypes :: [(GName l, ImportType (GName l))]
-- | Types of imported capabilities.
, moduleImportCaps :: [(GName l, ImportCap (GName l))]
-- | Types of imported foreign values.
, moduleImportValues :: [(GName l, ImportValue (GName l))]
-- Local ------------------------------
-- | Top-level things
, moduleTops :: [Top l] }
deriving instance ShowLanguage l => Show (Module l)
instance NFDataLanguage l => NFData (Module l) where
rnf !mm
= rnf (moduleName mm)
`seq` rnf (moduleExportTypes mm)
`seq` rnf (moduleExportValues mm)
`seq` rnf (moduleImportModules mm)
`seq` rnf (moduleImportTypes mm)
`seq` rnf (moduleImportCaps mm)
`seq` rnf (moduleImportValues mm)
`seq` rnf (moduleTops mm)
-- | Check if this is the `Main` module.
isMainModule :: Module l -> Bool
isMainModule mm
= isMainModuleName $ moduleName mm
-- Top Level Thing ------------------------------------------------------------
data Top l
-- | Some top-level, possibly recursive clauses.
= TopClause
{ topAnnot :: GAnnot l
, topClause :: GClause l }
-- | Data type definition.
| TopData
{ topAnnot :: GAnnot l
, topDataDef :: DataDef (GName l) }
deriving instance ShowLanguage l => Show (Top l)
instance NFDataLanguage l => NFData (Top l) where
rnf !top
= case top of
TopClause a c -> rnf a `seq` rnf c
TopData a def -> rnf a `seq` rnf def