-
Notifications
You must be signed in to change notification settings - Fork 28
/
Simple.hs
63 lines (50 loc) · 1.48 KB
/
Simple.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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" ++ " " ++ args
return ()
opts :: [(String, String -> Repl ())]
opts =
[ ("help", help . words), -- :help
("say", say) -- :say
]
ini :: Repl ()
ini = liftIO $ putStrLn "Welcome!"
final :: Repl ExitDecision
final = do
liftIO $ putStrLn "Goodbye!"
return Exit
repl_alt :: IO ()
repl_alt = evalReplOpts $ ReplOpts
{ banner = const $ pure ">>> "
, command = cmd
, options = opts
, prefix = Just ':'
, multilineCommand = Just "paste"
, tabComplete = (Word0 completer)
, initialiser = ini
, finaliser = final
}
customBanner :: MultiLine -> Repl String
customBanner SingleLine = pure ">>> "
customBanner MultiLine = pure "| "
repl :: IO ()
repl = evalRepl (const $ pure ">>> ") cmd opts (Just ':') (Just "paste") (Word0 completer) ini final
main :: IO ()
main = pure ()