]> git.rkrishnan.org Git - yorgey.git/blob - hw2/LogAnalysis.hs
hw9: no homework
[yorgey.git] / hw2 / LogAnalysis.hs
1 {-# OPTIONS_GHC -Wall #-}
2 module LogAnalysis where
3
4 import Log
5
6 parseMessage :: String -> LogMessage
7 parseMessage s = let ws = words s in
8                  parseMessage' ws
9                      where
10                        parseMessage' ("I":ts:ws') = LogMessage Info (read ts) (unwords ws')
11                        parseMessage' ("W":ts:ws') = LogMessage Warning (read ts) (unwords ws')
12                        parseMessage' ("E":level:ts:ws') = LogMessage (Error (read level)) (read ts) (unwords ws')
13                        parseMessage' x = Unknown (unwords x)
14
15 parse :: String -> [LogMessage]
16 parse s = map parseMessage (lines s)
17
18 -- Exercise 2
19 insert :: LogMessage -> MessageTree -> MessageTree
20 insert (LogMessage t ts s) (Leaf) = Node Leaf (LogMessage t ts s) Leaf
21 insert (LogMessage t1 ts1 s1) (Node lt (LogMessage t2 ts2 s2) rt) | ts1 <= ts2 = Node (insert (LogMessage t1 ts1 s1) lt) (LogMessage t2 ts2 s2) rt
22                                                                   | otherwise = Node lt (LogMessage t2 ts2 s2) (insert (LogMessage t1 ts1 s1) rt)
23 insert _ tree = tree
24
25 -- Exercise 3
26 build :: [LogMessage] -> MessageTree
27 build = foldr (\msg t -> insert msg t) Leaf
28
29 -- Exercise 4
30 inOrder :: MessageTree -> [LogMessage]
31 inOrder (Leaf) = []
32 inOrder (Node lt rootmsg rt) = inOrder lt ++ [rootmsg] ++ inOrder rt
33
34 -- Exercise 5
35 whatWentWrong :: [LogMessage] -> [String]
36 whatWentWrong ls = let sortedLogMsgs = inOrder (build ls)
37                    in
38                      filterErrorMessages (>= 50) sortedLogMsgs
39                          where
40                            filterErrorMessages _ [] = [""]
41                            filterErrorMessages f ((LogMessage (Error level) _ s):ms) | f level = s: filterErrorMessages f ms
42                                                                                       | otherwise = filterErrorMessages f ms
43                            filterErrorMessages f (_:ms) = filterErrorMessages f ms