{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad.Trans
import System.Console.Haskeline
import qualified Evaluator as Eval
import qualified Environment as Env
import System.Exit
main :: IO ()
main = runInputT defaultSettings $ withInterrupt $ loop Env.empty
loop :: Env.Repl -> InputT IO ()
loop environment@(Env.Repl _ _ _ wasCtrlC) = do
str' <- handleInterrupt (return Nothing) getInput
let env = environment {Env.ctrlc = False}
case str' of
Nothing -> if wasCtrlC then lift $ exitWith (ExitFailure 130)
else do
lift $ putStrLn "(Ctrl-C again to exit)"
loop $ environment {Env.ctrlc = True}
Just "" -> loop env
Just str -> do
let env' = Env.insert str env
success <- liftIO $ Eval.runRepl env'
loop (if success then env' else env)
getInput :: InputT IO (Maybe String)
getInput = get "> " ""
where
get str old = do
input <- getInputLine str
case input of
Nothing -> return $ Just old
Just new -> continueWith (old ++ new)
continueWith str
| null str || last str /= '\\' = return $ Just str
| otherwise = get "| " (init str ++ "\n")