packages feed

elm-repl-0.2.2.1: src/Repl.hs

module Repl (run) where

import Control.Monad.Trans
import System.Console.Haskeline hiding (handle)
import System.Exit

import Monad

import qualified Action      as Act
import qualified Command     as Cmd
import qualified Evaluator   as Eval
import qualified Environment as Env
import qualified Flags
import qualified Parse

run :: Flags.Flags -> Settings ReplM -> IO ExitCode
run flags settings =
    runReplM flags initialEnv . runInputT settings $ withInterrupt repl
  where
    initialEnv = Env.empty (Flags.compiler flags)

repl :: InputT ReplM ExitCode
repl = do
  str' <- handleInterrupt (return $ Just "") getInput
  case str' of
    Nothing -> return ExitSuccess
    Just str -> do
      let action = Parse.input str
      result <- lift $ handle action
      case result of
        Just exit -> return exit
        Nothing   -> repl

handle :: Act.Action -> ReplM (Maybe ExitCode)
handle action =
    case action of
      Act.Command cmd -> Cmd.run cmd

      Act.Skip -> return Nothing

      Act.Code src ->
          do Eval.evalPrint src
             return Nothing

getInput :: (MonadException m) => InputT m (Maybe String)
getInput = go "> " ""
    where
      go str old = do
        input <- getInputLine str
        case input of
          Nothing  -> return Nothing
          Just new -> continueWith (old ++ new)

      continueWith str
        | null str || last str /= '\\' = return $ Just str
        | otherwise = go "| " (init str ++ "\n")