ddc-source-tetra-0.4.1.1: DDC/Source/Tetra/Module.hs
module DDC.Source.Tetra.Module
( -- * Modules
Module (..)
, isMainModule
, ExportSource (..)
, ImportSource (..)
-- * 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 (..)
, ImportSource (..))
-- Module ---------------------------------------------------------------------
data Module a n
= Module
{ -- | Name of this module
moduleName :: !ModuleName
-- Exports ----------------------------
-- | Names of exported types (level-1).
, moduleExportTypes :: [n]
-- | Names of exported values (level-0).
, moduleExportValues :: [n]
-- Imports ----------------------------
-- | Imported modules.
, moduleImportModules :: [ModuleName]
-- | Kinds of imported foreign types.
, moduleImportTypes :: [(n, ImportSource n)]
-- | Types of imported foreign values.
, moduleImportValues :: [(n, ImportSource n)]
-- Local ------------------------------
-- | Top-level things
, moduleTops :: [Top a n] }
deriving Show
instance (NFData a, NFData n) => NFData (Module a n) where
rnf !mm
= rnf (moduleName mm)
`seq` rnf (moduleExportTypes mm)
`seq` rnf (moduleExportValues mm)
`seq` rnf (moduleImportModules mm)
`seq` rnf (moduleImportTypes mm)
`seq` rnf (moduleImportValues mm)
`seq` rnf (moduleTops mm)
-- | Check if this is the `Main` module.
isMainModule :: Module a n -> Bool
isMainModule mm
= isMainModuleName
$ moduleName mm
-- Top Level Thing ------------------------------------------------------------
data Top a n
-- | Top-level, possibly recursive binding.
= TopBind a (Bind n) (Exp a n)
-- | Data type definition.
| TopData
{ topAnnot :: a
, topDataDef :: DataDef n }
deriving Show
instance (NFData a, NFData n) => NFData (Top a n) where
rnf !top
= case top of
TopBind a b x
-> rnf a `seq` rnf b `seq` rnf x
TopData a def
-> rnf a `seq` rnf def