module Repl.Untyped (runUntypedRepl) where import Language.Lambda.Shared.Errors (LambdaException()) import Language.Lambda.Shared.UniqueSupply (defaultUniques) import Language.Lambda.Untyped import Repl.Shared import Data.Text (singleton) import Data.Text.IO (putStrLn) import RIO import RIO.State import RIO.Text (pack, unpack) import System.Console.Repline import Control.Monad.Except type EvalT name m = StateT (EvalState name) (ExceptT LambdaException m) type Repl a = HaskelineT (EvalT Text IO) a runUntypedRepl :: IO () runUntypedRepl = void . runExceptT . evalStateT (evalReplOpts replOpts) $ initialState where replOpts = ReplOpts { banner = const $ unpack <$> prompt', command = evalLambda . pack, options = commands, prefix = Just ':', multilineCommand = Nothing, tabComplete = Custom completer, initialiser = initializer, finaliser = return Exit } initialState = mkEvalState defaultUniques prompt' :: Repl Text prompt' = prompt $ singleton lambda evalLambda :: Text -> Repl () evalLambda input = do state' <- get let res = runEval (evalText input) state' case res of Left err -> liftIO . putStrLn . textDisplay $ err Right (res', newState) -> do put newState liftIO . putStrLn . prettyPrint $ res'