module Mueval.Interpreter (interpreterSession, printInterpreterError, ModuleName) where
import Language.Haskell.Interpreter.GHC (eval, newSession, reset, setImports,
setUseLanguageExtensions, typeChecks,
typeOf, withSession,
Interpreter, InterpreterError, ModuleName)
import Control.Monad.Trans (liftIO)
import System.Exit (exitWith, ExitCode(ExitFailure))
say :: String -> Interpreter ()
say = liftIO . putStr . take 1024
printInterpreterError :: InterpreterError -> IO ()
printInterpreterError e = do putStrLn $ take 1024 $ "Oops... " ++ (show e)
(exitWith $ ExitFailure 1)
interpreter :: [ModuleName] -> String -> Interpreter ()
interpreter modules expr = do setUseLanguageExtensions False
reset
setImports modules
checks <- typeChecks expr
if checks then do
say "Expression type: "
say =<< typeOf expr
result <- eval expr
say $ "\nresult: " ++ show result ++ "\n"
else error "Expression does not type check."
interpreterSession :: [ModuleName] -> String -> IO ()
interpreterSession mds expr = newSession >>= (flip withSession) (interpreter mds expr)