packages feed

hic-0.0.0.1: src/Language/Cimple/Hic/Feature.hs

{-# LANGUAGE RankNTypes #-}
module Language.Cimple.Hic.Feature
    ( Feature (..)
    ) where

import           Control.Monad.State.Strict        (State)
import           Data.Text                         (Text)
import qualified Language.Cimple                   as C
import           Language.Cimple.Hic.Ast           (HicNode, Node)
import           Language.Cimple.Hic.Context       (Context)
import           Language.Cimple.Hic.Program.Types (Program)

data Feature = Feature
    { featureName     :: Text
    -- | Phase 1: Gather global context.
    -- Runs in the fixpoint loop.
    , featureGather   :: Program (C.Lexeme Text) -> Context -> Context

    -- | Phase 2: Infer high-level constructs.
    -- Runs in the fixpoint loop. Returns True if changes were made.
    , featureInfer    :: Context -> FilePath -> Node (C.Lexeme Text) -> State Bool (Node (C.Lexeme Text))

    -- | Phase 3: Validate invariants after inference is complete.
    , featureValidate :: Context -> Program (C.Lexeme Text) -> [Text]

    -- | Lowering: Convert high-level constructs back to Cimple.
    , featureLower    :: forall l. HicNode l (C.Node l) -> Maybe (C.Node l)
    }