Skip to content

Instantly share code, notes, and snippets.

@MarcusXavierr
Created July 18, 2022 21:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MarcusXavierr/a91253b0fccf5ae2684bf4bfa7771c21 to your computer and use it in GitHub Desktop.
Save MarcusXavierr/a91253b0fccf5ae2684bf4bfa7771c21 to your computer and use it in GitHub Desktop.
Improved code CIS 194 week 2
{-# OPTIONS_GHC -Wall #-}
module Main where
import Log
parse :: String -> [LogMessage]
parse xs = map parseMessage $ lines xs
parseMessage :: String -> LogMessage
parseMessage = createLog . words
createLog :: [String] -> LogMessage
createLog ("E":err:t:m) = LogMessage (Error (read err)) ( read t ) (unwords m )
createLog ("I":t:m) = LogMessage Info ( read t ) (unwords m )
createLog ("W":t:m) = LogMessage Warning ( read t ) (unwords m )
createLog xs = Unknown (unwords xs )
insert :: LogMessage -> MessageTree -> MessageTree
insert logM Leaf = Node Leaf logM Leaf
insert logM (Node l m r)
|getTimestamp logM > getTimestamp m = Node l m ( insert logM r )
|getTimestamp logM < getTimestamp m = Node ( insert logM l ) m r
|otherwise = Node l m r
getTimestamp :: LogMessage -> TimeStamp
getTimestamp (Unknown _) = error "Unknown logmessage dont have timestamp"
getTimestamp (LogMessage _ x _) = x
build :: [LogMessage] -> MessageTree
build = foldr insert Leaf
inOrder :: MessageTree -> [LogMessage]
inOrder Leaf = []
inOrder (Node l m r) = inOrder l ++ [m] ++ inOrder r
whatWentWrong :: [LogMessage] -> [String]
whatWentWrong = map getMessageFromLog . filter (\x -> isError x && getErrorIntensity x > 50 )
isError :: LogMessage -> Bool
isError (LogMessage (Error _) _ _) = True
isError _ = False
getMessageFromLog :: LogMessage -> String
getMessageFromLog (Unknown _) = error "Unknown dont have message"
getMessageFromLog (LogMessage _ _ m) = m
getErrorIntensity :: LogMessage -> Int
getErrorIntensity (LogMessage (Error x) _ _) = x
getErrorIntensity _ = error "this function only works with Error type"
sortLog :: [LogMessage] -> [LogMessage]
sortLog = inOrder . build
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment