@@ -22,6 +22,7 @@ import Prelude hiding (lex)
22import Commands
22import Commands
24import Data.Char (isSpace)
24import Data.Char (isSpace)
25+import Data.List (isPrefixOf)
26import Control.Applicative hiding (many)
27import Control.Applicative hiding (many)
@@ -36,16 +37,20 @@ import qualified Language.PureScript.Parser.Common as C (mark, same)
36parseCommand :: String -> Either String Command
37parseCommand :: String -> Either String Command
37parseCommand cmdString =
38parseCommand cmdString =
38 case splitCommand cmdString of
39 case splitCommand cmdString of
41+ | matches "?" -> return Help
39− Just ('?', _) -> return Help
42+ | matches "help" -> return Help
40− Just ('q', _) -> return Quit
43+ | matches "quit" -> return Quit
41− Just ('r', _) -> return Reset
44+ | matches "reset" -> return Reset
42− Just ('i', moduleName) -> Import <$> parseRest P.moduleName moduleName
45+ | matches "import" -> Import <$> parseRest P.moduleName arg
43− Just ('b', moduleName) -> Browse <$> parseRest P.moduleName moduleName
46+ | matches "browse" -> Browse <$> parseRest P.moduleName arg
44− Just ('m', filename) -> return $ LoadFile (trimEnd filename)
47+ | matches "module" -> return $ LoadFile (trimEnd arg)
45− Just ('s', command) -> return $ Show (trimEnd command)
48+ | matches "show" -> return $ Show (trimEnd cmd)
46− Just ('t', expr) -> TypeOf <$> parseRest P.parseValue expr
49+ | matches "type" -> TypeOf <$> parseRest P.parseValue arg
47− Just ('k', ty) -> KindOf <$> parseRest P.parseType ty
50+ | matches "kind" -> KindOf <$> parseRest P.parseType arg
48− Just _ -> Left $ "Unrecognized command. Type :? for help."
51+ | otherwise -> Left $ "Unrecognized command. Type :? for help."
53+ matches = isPrefixOf cmd
49 Nothing -> parseRest (psciLet <|> psciExpression) cmdString
54 Nothing -> parseRest (psciLet <|> psciExpression) cmdString
51 parseRest :: P.TokenParser a -> String -> Either String a
56 parseRest :: P.TokenParser a -> String -> Either String a
@@ -53,14 +58,19 @@ parseCommand cmdString =
53 ts <- P.lex "" s
58 ts <- P.lex "" s
54 P.runTokenParser "" (p <* eof) ts
59 P.runTokenParser "" (p <* eof) ts
61+ trimStart :: String -> String
62+ trimStart = dropWhile isSpace
56 trimEnd :: String -> String
64 trimEnd :: String -> String
57− trimEnd = reverse . dropWhile isSpace . reverse
65+ trimEnd = reverse . trimStart . reverse
60− -- Split a command into a command char and the trailing string
68+ -- Tries to split a command into a directive and the argument.
62− splitCommand :: String -> Maybe (Char, String)
70+ splitCommand :: String -> Maybe (String, String)
63− splitCommand (':' : c : s) = Just (c, dropWhile isSpace s)
71+ splitCommand (':' : cmd) = Just (directive, trimStart arg)
73+ (directive, arg) = break isSpace cmd
64 splitCommand _ = Nothing
74 splitCommand _ = Nothing