Skip to content

Instantly share code, notes, and snippets.

@MarcusXavierr
Created July 18, 2022 02:27
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/230bc0a7d56cebcc5d7181e7f7afb235 to your computer and use it in GitHub Desktop.
Save MarcusXavierr/230bc0a7d56cebcc5d7181e7f7afb235 to your computer and use it in GitHub Desktop.
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 [] = error "Empty list error"
createLog xs = case head xs of
"E" -> LogMessage (Error (read (xs !! 1))) (read ( xs !! 2 )) ( (unwords . drop 3) xs )
"I" -> LogMessage Info (read ( xs !! 1 )) ( (unwords . drop 2) xs )
"W" -> LogMessage Warning (read ( xs !! 1 )) ( (unwords . drop 2) 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 [] = []
whatWentWrong (x:xs)
|isError x && getErrorIntensity x > 50 = getMessageFromLog x : whatWentWrong xs
|otherwise = whatWentWrong xs
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
main :: IO ()
main = do
putStrLn "hello world"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment