module Coda.Console
( heading
, console
) where
import Coda.Syntax.Dyck
import Coda.Syntax.Lexer
import Data.String
import Coda.Console.Command
import Coda.Console.Completion
import Coda.Console.Options
import Coda.Console.Unicode
import Coda.Version
import Control.Exception.Lens
import Control.Lens
import Control.Monad.State
import Data.Char
import Data.Text (pack)
import System.Console.Haskeline
import System.Exit.Lens
import Prelude hiding (lex)
heading :: String
heading = "Coda, version " ++ version ++ ": http://github.com/ekmett/coda/ :? for help"
console :: ConsoleOptions -> IO ()
console opts = withUnicode $ do
unless (opts^.consoleOptionsNoHeading) $ putStrLn heading
runInputT settings loop
loop :: InputT IO ()
loop = do
minput <- getInputLine "λ> "
case Prelude.dropWhile isSpace <$> minput of
Nothing -> return ()
Just "quit" -> return ()
Just (':':cmd) -> do
lift $ handling (filtered (hasn't _ExitCode)) (liftIO . print) $ executeCommand cmd
loop
Just "" -> loop
Just input -> do
outputStrLn $ show $ spine (lex (pack input))
loop