Skip to content

Instantly share code, notes, and snippets.

@dabd
Last active August 29, 2015 14:03
Show Gist options
  • Select an option

  • Save dabd/36a16677db2b39f7ed63 to your computer and use it in GitHub Desktop.

Select an option

Save dabd/36a16677db2b39f7ed63 to your computer and use it in GitHub Desktop.
{-# OPTIONS_GHC -Wall #-}
module LogAnalysis where
import Log
-- ex 1
parseMessage :: String -> LogMessage
parseMessage line =
case words line of
("E":severity:timestamp:content) -> LogMessage (Error $ read severity) (read timestamp) (unwords content)
("W":timestamp:content) -> LogMessage Warning (read timestamp) (unwords content)
("I":timestamp:content) -> LogMessage Info (read timestamp) (unwords content)
_ -> Unknown line
parse :: String -> [LogMessage]
parse = map parseMessage . lines
-- ex 2
insert :: LogMessage -> MessageTree -> MessageTree
insert (Unknown _) mt = mt
insert _ (Node _ (Unknown _) _) = Leaf
insert m@(LogMessage _ _ _) Leaf = Node Leaf m Leaf
insert m@(LogMessage _ t _) (Node left m'@(LogMessage _ t' _) right)
| t < t' = Node (insert m left) m' right
| otherwise = Node left m' (insert m right)
-- ex 3
build :: [LogMessage] -> MessageTree
build = foldl (\tree msg -> insert msg tree) Leaf
-- ex 4
inOrder :: MessageTree -> [LogMessage]
inOrder Leaf = []
inOrder (Node left m right) = inOrder left ++ [m] ++ inOrder right
-- ex 5
whatWentWrong :: [LogMessage] -> [String]
whatWentWrong msgs = [s | LogMessage (Error severity) _ s <- inOrder $ build msgs, severity >= 50]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment