module Main where import System.Exit import qualified CC.Parser import qualified CC.Typecheck import CC.Types -- Put the passes in a type-level list to be able to run subsequences of -- passes. type Pass a b = Context -> a -> Either String b pass :: (Read a, Show b, Show e) => (Context -> a -> Either e b) -> Pass a b pass f ctx a = either (Left . show) Right (f ctx a) passJoin :: (Read a, Show b, Read b, Show c) => Pass a b -> Pass b c -> Pass a c passJoin f1 f2 ctx a = f1 ctx a >>= f2 ctx main :: IO () main = do let parse = pass CC.Parser.runPass typecheck = pass CC.Typecheck.runPass let combined = parse `passJoin` typecheck source <- getContents let context = Context "" case combined context (read source) of Right prog -> print prog Left err -> die (show err)