hermit-0.1.1.0: src/Language/HERMIT/CoreExtra.hs
module Language.HERMIT.CoreExtra
(
-- * Generic Data Type
-- $typenote
Core(..)
, CoreDef(..)
-- * GHC Core Extras
, CoreTickish
, defToRecBind
) where
import GhcPlugins
---------------------------------------------------------------------
-- $typenote
-- NOTE: 'Type' is not included in the generic datatype.
-- However, we could have included it and provided the facility for descending into types.
-- We have not done so because
-- (a) we do not need that functionality, and
-- (b) the types are complicated and we're not sure that we understand them.
-- | Core is the sum type of all nodes in the AST that we wish to be able to traverse.
-- All 'Node' instances in HERMIT define their 'Generic' type to be 'Core'.
data Core = ModGutsCore ModGuts -- ^ The module.
| ProgramCore CoreProgram -- ^ A program (list of top-level bindings).
| BindCore CoreBind -- ^ A binding group.
| DefCore CoreDef -- ^ A recursive definition.
| ExprCore CoreExpr -- ^ An expression.
| AltCore CoreAlt -- ^ A case alternative.
---------------------------------------------------------------------
-- | A (potentially recursive) definition is an identifier and an expression.
-- In GHC Core, recursive definitions are encoded as ('Id', 'CoreExpr') pairs.
-- This data type is isomorphic.
data CoreDef = Def Id CoreExpr
-----------------------------------------------------------------------
-- | Unlike everything else, there is no synonym for 'Tickish' 'Id' provided by GHC, so we provide one.
type CoreTickish = Tickish Id
-- | Convert a list of recursive definitions into an (isomorphic) recursive binding group.
defToRecBind :: [CoreDef] -> CoreBind
defToRecBind = Rec . map (\ (Def v e) -> (v,e))
-----------------------------------------------------------------------