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/56399e9ec63f071f58a2 to your computer and use it in GitHub Desktop.

Select an option

Save dabd/56399e9ec63f071f58a2 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 = takeWhile severe . inOrder . build
where severe (LogMessage (Error severity) _ _)
| severity >= 50 = True
| otherwise = False
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment