Homework 2
21-06-14–21-06-16
module LogAnalysis where
import LogExercise 1
parseMessage :: String -> LogMessage
parseMessage s
| head ws == "E" = LogMessage (Error . read . head . tail $ ws) (read (ws !! 2)) (unwords (drop 3 ws))
| head ws == "I" = LogMessage Info (read . head . tail $ ws) (unwords (drop 2 ws))
| head ws == "W" = LogMessage Warning (read . head . tail $ ws) (unwords (drop 2 ws))
| otherwise = Unknown s
where ws = words s
parse :: String -> [LogMessage]
parse s = map parseMessage (lines s)
logMessageTime :: LogMessage -> TimeStamp
logMessageTime (LogMessage _ t _) = t
insert :: LogMessage -> MessageTree -> MessageTree
insert (Unknown _) t = t
insert msg leaf = Node Leaf msg Leaf
insert msg (Node treeL msgT treeR)
| logMessageTime msg <= logMessageTime msgT = Node (insert msg treeL) msgT treeR
| otherwise = Node treeL msgT (insert msg treeR)
buildLeaf :: [LogMessage] -> MessageTree -> MessageTree
buildLeaf [] t = t
buildLeaf (x:xs) t = buildLeaf xs (insert x t)
build :: [LogMessage] -> MessageTree
build ms = buildLeaf ms Leaf
inOrder :: MessageTree -> [LogMessage]
inOrder Leaf = []
inOrder (Node treeL msg treeR) = (inOrder treeL) ++ [msg] ++ (inOrder treeR)
whatWentWrong :: [LogMessage] -> [String]
whatWentWrong msgs = map str (filter err50 (inOrder (build msgs)))
investigate :: [LogMessage] -> [String]
investigate msgs = map strTime (filter time125135 (inOrder (build msgs)))
err50 :: LogMessage -> Bool
err50 (LogMessage (Error s) _ _) = s > 50
err50 _ = False
time125135 :: LogMessage -> Bool
time125135 (LogMessage _ t _) = (125 < t) && (t < 135)
time125135 _ = False
str :: LogMessage -> String
str (LogMessage _ _ s) = s
str (Unknown s) = s
strTime :: LogMessage -> String
strTime (LogMessage _ t s) = (show t) ++ s