packages feed

lambda-calculator-3.0.0: app/Repl/Shared.hs

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