packages feed

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

module Repl.Shared where

import Paths_lambda_calculator (version)

import Data.Text.IO (putStrLn)
import Data.Version (showVersion)
import RIO
import System.Console.Repline

mkReplOpts
  :: (MonadIO m, MonadThrow m)
  => (MultiLine -> HaskelineT m String)
  -> Command (HaskelineT m)
  -> Text
  -> ReplOpts m
mkReplOpts banner command helpMsg = ReplOpts
  { banner = banner,
    command = command,
    options = commands helpMsg,
    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) => Text -> [(String, String -> HaskelineT m ())]
commands helpMsg
  = [ ("h", help'),
      ("help", help'),
      ("q", quit'),
      ("quit", quit')
    ]
  where help' = const (helpCommand helpMsg)
        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 => Text -> HaskelineT io ()
helpCommand message = liftIO $ putStrLn message

version' :: Text
version' = fromString $ showVersion version