@@ -9,6 +9,9 @@ import System.Environment
99import System.Console.ANSI
1010
1111data OutputFlag = Verbose | Normal
12+ data InteractiveFlag = Interactive | Single
13+
14+ type Flags = (InteractiveFlag , OutputFlag , AngleFlag )
1215
1316prompt :: IO String
1417prompt = do
@@ -24,11 +27,11 @@ interactive oflag aflag = do
2427 " :q" -> exit
2528 " clear" -> clearOut >> interactive oflag aflag
2629 _ -> case oflag of
27- Normal -> evaluateInput input aflag (interactive Normal aflag)
28- Verbose -> verbose input aflag (interactive Verbose aflag)
30+ Normal -> evalNormal input aflag (interactive oflag aflag)
31+ Verbose -> evalVerbose input aflag (interactive oflag aflag)
2932
30- evaluateInput :: String -> AngleFlag -> IO () -> IO ()
31- evaluateInput input aflag fn = case parse input of
33+ evalNormal :: String -> AngleFlag -> IO () -> IO ()
34+ evalNormal input aflag fn = case parse input of
3235 -- successful parse
3336 Result rp -> case eval rp aflag of
3437 -- successful evaluated
@@ -48,8 +51,8 @@ evaluateInput input aflag fn = case parse input of
4851 putStrLn " Mathematical Error!"
4952 fn
5053
51- verbose :: String -> AngleFlag -> IO () -> IO ()
52- verbose input aflag fn = case lexer input of
54+ evalVerbose :: String -> AngleFlag -> IO () -> IO ()
55+ evalVerbose input aflag fn = case lexer input of
5356 -- successful lexer
5457 Result rl -> case postfix rl of
5558 Result rp -> do
@@ -91,25 +94,36 @@ printRed s = do
9194 setSGR [Reset ]
9295
9396
94- parseArgs :: [String ] -> IO ()
95- parseArgs [] = interactive Normal None
96- parseArgs [" -h" ] = usage >> exit
97- parseArgs [" -V" ] = version >> exit
98- parseArgs [" -v" ] = interactive Verbose None
99- parseArgs (input : " -v" : [] ) = verbose input None exit
100- parseArgs (" -v" : input : [] ) = verbose input None exit
101- parseArgs [input] = evaluateInput input None exit
102- parseArgs _ = exit
97+ parseArgs :: [String ] -> Flags -> IO ()
98+ parseArgs [] fs = execute fs Nothing
99+ parseArgs (" -d" : xs ) (i, o, _) = parseArgs xs (i, o, Deg )
100+ parseArgs (" -h" : _) _ = usage >> exit
101+ parseArgs (" -i" : xs) (_, o, a) = parseArgs xs (Interactive , o, a)
102+ parseArgs (" -v" : xs) (i, _, a) = parseArgs xs (i, Verbose , a)
103+ parseArgs (" -V" : _) _ = version >> exit
104+ parseArgs [input] fs = execute fs (Just input)
105+ parseArgs _ _ = usage >> exit
106+
107+
108+ execute :: Flags -> Maybe String -> IO ()
109+ execute (Interactive , Verbose , a) (Just input) = evalVerbose input a (interactive Verbose a)
110+ execute (Interactive , Normal , a) (Just input) = evalNormal input a (interactive Normal a)
111+ execute (Single , Verbose , a) (Just input) = evalVerbose input a exit
112+ execute (Single , Normal , a) (Just input) = evalNormal input a exit
113+ execute (_, v, a) Nothing = interactive v a
103114
104115version :: IO ()
105116
106117usage :: IO ()
107118usage = do
108119 putStrLn " Usage:"
109- putStrLn " \t calc [TERM] [ARGUMENT] - Calculator\n "
110- putStrLn " \t -h\t help\t - show this dialog"
111- putStrLn " \t -v\t verbose\t - print token and postfix"
112- putStrLn " \t -V\t version\t - show version"
120+ putStrLn " \t calc [ARGUMENT] [TERM] - Calculator"
121+ putStrLn " \t [TERM] musst be at the end.\n "
122+ putStrLn " \t -d\t degrese\t\t - use degree in trigonometric functions"
123+ putStrLn " \t -h\t help\t\t - show this dialog"
124+ putStrLn " \t -i\t interactive\t - force interactive mode"
125+ putStrLn " \t -v\t verbose\t\t - print token and postfix"
126+ putStrLn " \t -V\t version\t\t - show version"
113127
114128clearOut :: IO ()
115129clearOut = do
@@ -121,4 +135,6 @@ exit = do
121135 exitWith ExitSuccess
122136
123137main :: IO ()
124- main = getArgs >>= parseArgs
138+ main = do
139+ args <- getArgs
140+ parseArgs args (Single , Normal , None )
0 commit comments