module Main where import Tip.HaskellFrontend import Text.Show.Pretty hiding (Name) import System.Environment import qualified Data.Foldable as F import Data.Ord import Control.Monad import Tip.Core import Tip.Fresh import Tip.Simplify import Tip.Lint import Tip.Passes import Tip.Utils.Rename import Tip.Pretty import Tip.Pretty.SMT as SMT import Text.PrettyPrint main :: IO () main = do f:es <- getArgs thy <- readHaskellFile Params { file = f , include = [] , flags = [] -- [PrintCore,PrintProps,PrintExtraIds,PrintInitialTip] , only = es -- [] , extra = [] -- es } -- putStrLn (ppRender thy) let renamed_thy = renameWith disambigId thy let pipeline = freshPass $ runPasses [ SimplifyAggressively , RemoveNewtype , UncurryTheory , CommuteMatch , SimplifyGently , IfToBoolOp , RemoveAliases, CollapseEqual , CommuteMatch , SimplifyGently , CSEMatch , EliminateDeadCode ] print (SMT.ppTheory (pipeline renamed_thy)) data Var = Var String | Refresh Var Int deriving (Show,Eq,Ord) varMax :: Var -> Int varMax Var{} = 0 varMax (Refresh v i) = varMax v `max` i instance PrettyVar Var where varStr (Var "") = "x" varStr (Var xs) = xs varStr (Refresh v i) = varStr v disambigId :: Id -> [Var] disambigId i = vs : [ Refresh vs x | x <- [0..] ] where vs = Var $ case varStr i of { [] -> "x"; xs -> xs } instance Name Var where fresh = refresh (Var "") refresh (Refresh v _) = refresh v refresh v@Var{} = Refresh v `fmap` fresh freshNamed s = refresh (Var s) getUnique (Refresh _ i) = i getUnique Var{} = 0