module Repl.Shared where
import CliOptions (Language(..))
import Paths_lambda_calculator (version)
import Language.Lambda.Shared.Errors (LambdaException())
import Language.Lambda.Shared.UniqueSupply (defaultUniques)
import Language.Lambda.SystemF
import Data.Text (singleton)
import Data.Text.IO (putStrLn)
import Data.Version (showVersion)
import RIO
import RIO.State
import RIO.Text (pack, unpack)
import System.Console.Repline
import Control.Monad.Except
import qualified Data.Map as M
mkReplOpts banner command = ReplOpts
{ banner = banner,
command = command,
options = commands,
prefix = Just ':',
multilineCommand = Nothing,
tabComplete = Custom completer,
initialiser = initializer,
finaliser = return Exit
}
prompt :: Applicative ap => Text -> HaskelineT ap Text
prompt prefix = pure $ prefix <> " > "
commands :: (MonadIO m, MonadThrow m) => [(String, String -> HaskelineT m ())]
commands
= [ ("h", help'),
("help", help'),
("q", quit'),
("quit", quit')
]
where help' = const helpCommand
quit' = const abort
completer :: Monad m => CompletionFunc m
completer (left, _) = pure (left, []) -- No tab completion
initializer :: MonadIO io => HaskelineT io ()
initializer = liftIO $ putStrLn greeting
where greeting = "Lambda Calculator ("
<> version'
<> ")\nType :h for help\n"
helpCommand :: MonadIO io => HaskelineT io ()
helpCommand = liftIO $ putStrLn banner
where banner = " Commands available: \n\n"
<> " :help, :h\tShow this help\n"
<> " :quit, :q\tQuit\n"
version' :: Text
version' = fromString $ showVersion version