module ConstMath.Plugin ( plugin -- :: Plugin ) where import ConstMath.Types import ConstMath.Pass (constMathProgram) import GhcPlugins import Data.List (intersperse) plugin :: Plugin plugin = defaultPlugin { installCoreToDos = install } install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo] install args todos = do reinitializeGlobals let pass = CoreDoPasses [constMath] return $ intersperse pass todos where constMath = CoreDoPluginPass "Constant Math Elimination" (bindsOnlyPass (constMathProgram (parseOpts args)) ) -- TODO: use a real parser parseOpts :: [CommandLineOption] -> Opts parseOpts = foldr ($) defaultOpts . map mkArg where mkArg flag | flag `elem` ["-v","--verbose","--verbosity=1"] = setVerbosity (CmVerbose 1) | flag `elem` ["-v11", "-verbosity=11","--trace"] = setVerbosity Trace | flag `elem` ["-q", "--quiet","--verbosity=0", "-v0"] = setVerbosity None | otherwise = id