X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=NormalizeTypes.hs;h=e959bbba42fe5e067278668cfca6ce1c048e3450;hb=ce21f6b5bc31049d9f663bab7c0f7984ccec5875;hp=e61570abf05d673f86681ecc5fdde918f5c974a8;hpb=91f8a87a34c9b4493bacda77b7df3c95951d3a67;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/NormalizeTypes.hs b/NormalizeTypes.hs index e61570a..e959bbb 100644 --- a/NormalizeTypes.hs +++ b/NormalizeTypes.hs @@ -7,11 +7,14 @@ import qualified Control.Monad.Trans.Writer as Writer import qualified Control.Monad.Trans.State as State import qualified Data.Monoid as Monoid import qualified Data.Accessor.Template +import Data.Accessor +import qualified Data.Map as Map import Debug.Trace -- GHC API import CoreSyn import qualified UniqSupply +import qualified VarSet import Outputable ( Outputable, showSDoc, ppr ) -- Local imports @@ -19,11 +22,28 @@ import CoreShow import Pretty data TransformState = TransformState { - tsUniqSupply_ :: UniqSupply.UniqSupply + tsUniqSupply_ :: UniqSupply.UniqSupply + , tsBindings_ :: Map.Map CoreBndr CoreExpr + , tsNormalized_ :: VarSet.VarSet -- ^ The binders that have been normalized } $( Data.Accessor.Template.deriveAccessors ''TransformState ) -type TransformMonad a = Writer.WriterT Monoid.Any (State.State TransformState) a +-- A session of multiple transformations over multiple expressions +type TransformSession = (State.State TransformState) +-- Wrap a writer around a TransformSession, to run a single transformation +-- over a single expression and track if the expression was changed. +type TransformMonad = Writer.WriterT Monoid.Any TransformSession + -- | Transforms a CoreExpr and keeps track if it has changed. type Transform = CoreExpr -> TransformMonad CoreExpr + +-- Finds the value of a global binding, if available +getGlobalBind :: CoreBndr -> TransformSession (Maybe CoreExpr) +getGlobalBind bndr = do + bindings <- getA tsBindings + return $ Map.lookup bndr bindings + +-- Adds a new global binding with the given value +addGlobalBind :: CoreBndr -> CoreExpr -> TransformSession () +addGlobalBind bndr expr = modA tsBindings (Map.insert bndr expr)