Homework 2

21-06-14–21-06-16
module LogAnalysis where 
import Log

Exercise 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