repline-0.3.0.0: examples/Simple.hs
module Main (main, repl) where
import Control.Monad.Trans
import Data.List (isPrefixOf)
import System.Console.Repline
import System.Process (callCommand)
type Repl a = HaskelineT IO a
-- Evaluation : handle each line user inputs
cmd :: String -> Repl ()
cmd input = liftIO $ print input
-- Tab Completion: return a completion for partial words entered
completer :: Monad m => WordCompleter m
completer n = do
let names = ["kirk", "spock", "mccoy"]
return $ filter (isPrefixOf n) names
-- Commands
help :: [String] -> Repl ()
help args = liftIO $ print $ "Help: " ++ show args
say :: [String] -> Repl ()
say args = do
_ <- liftIO $ callCommand $ "cowsay" ++ " " ++ (unwords args)
return ()
opts :: [(String, [String] -> Repl ())]
opts =
[ ("help", help), -- :help
("say", say) -- :say
]
ini :: Repl ()
ini = liftIO $ putStrLn "Welcome!"
repl :: IO ()
repl = evalRepl (pure ">>> ") cmd opts (Just ':') (Word0 completer) ini
main :: IO ()
main = pure ()