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
|
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
module Main (main, repl) where
import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.State.Strict
import Data.List (isPrefixOf)
import qualified Data.Set as Set
import System.Console.Repline
-------------------------------------------------------------------------------
-- Prefix Completion
-------------------------------------------------------------------------------
type Repl a = HaskelineT IO a
-- Evaluation
cmd :: String -> Repl ()
cmd input = liftIO $ print input
-- Prefix tab completeter
defaultMatcher :: MonadIO m => [(String, CompletionFunc m)]
defaultMatcher =
[ (":file", fileCompleter),
(":holiday", listCompleter ["christmas", "thanksgiving", "festivus"])
]
-- Default tab completer
byWord :: Monad m => WordCompleter m
byWord n = do
let names = ["picard", "riker", "data", ":file", ":holiday"]
return $ filter (isPrefixOf n) names
files :: String -> Repl ()
files args = liftIO $ do
contents <- readFile args
putStrLn contents
holidays :: String -> Repl ()
holidays "" = liftIO $ putStrLn "Enter a holiday."
holidays xs = liftIO $ do
putStrLn $ "Happy " ++ xs ++ "!"
opts :: [(String, String -> Repl ())]
opts =
[ ("file", files),
("holiday", holidays)
]
inits :: Repl ()
inits = return ()
final :: Repl ExitDecision
final = return Exit
repl :: IO ()
repl = evalRepl (const $ pure ">>> ") cmd opts Nothing Nothing (Prefix (wordCompleter byWord) defaultMatcher) inits final
main :: IO ()
main = pure ()
|