Skip to content

Instantly share code, notes, and snippets.

@paul-english
Last active August 29, 2015 14:06
Show Gist options
  • Save paul-english/8112b4f822b0060b9f62 to your computer and use it in GitHub Desktop.
Save paul-english/8112b4f822b0060b9f62 to your computer and use it in GitHub Desktop.
haskell-hw03.hs
-- Exercise 1
invalidInt :: MaybeInt -> Bool
invalidInt (ValidInt _) = False
invalidInt InvalidInt = True
maybeIntValue :: MaybeInt -> Int
maybeIntValue (ValidInt val) = val
maybeIntValue InvalidInt = 0
parseError :: [String] -> MaybeLogMessage
parseError m@(_:e:time:tokens)
| length(m) < 3 = InvalidLM (unwords m)
| invalidInt errorLevel = InvalidLM (unwords m)
| invalidInt timeStamp = InvalidLM (unwords m)
| otherwise = ValidLM (LogMessage (Error (maybeIntValue errorLevel)) (maybeIntValue timeStamp) (unwords tokens))
where
errorLevel = readInt e
timeStamp = readInt time
parseError m = InvalidLM (unwords m)
parseInfo :: [String] -> MaybeLogMessage
parseInfo m@(_:time:tokens)
| length(m) < 2 = InvalidLM (unwords m)
| invalidInt timeStamp = InvalidLM (unwords m)
| otherwise = ValidLM (LogMessage Info (maybeIntValue timeStamp) (unwords tokens))
where
timeStamp = readInt time
parseInfo m = InvalidLM (unwords m)
parseWarning :: [String] -> MaybeLogMessage
parseWarning m@(_:time:tokens)
| length(m) < 2 = InvalidLM (unwords m)
| invalidInt timeStamp = InvalidLM (unwords m)
| otherwise = ValidLM (LogMessage Warning (maybeIntValue timeStamp) (unwords tokens))
where
timeStamp = readInt time
parseWarning m = InvalidLM (unwords m)
parseMessage :: String -> MaybeLogMessage
parseMessage message
= case tokens of
[] -> InvalidLM message
("E":_) -> parseError tokens
("I":_) -> parseInfo tokens
("W":_) -> parseWarning tokens
_ -> InvalidLM message
where
tokens = words message
-- Exercise 2
validMessage :: MaybeLogMessage -> Bool
validMessage (ValidLM _) = True
validMessage (InvalidLM _) = False
getMessage :: MaybeLogMessage -> LogMessage
getMessage (ValidLM lm) = lm
validMessagesOnly :: [MaybeLogMessage] -> [LogMessage]
validMessagesOnly messages = map getMessage (filter validMessage messages)
-- Exercise 3
parse :: String -> [LogMessage]
parse file = validMessagesOnly (map parseMessage (lines file))
-- Exercise 4
compareMsgs :: LogMessage -> LogMessage -> Ordering
compareMsgs (LogMessage _ t1 _) (LogMessage _ t2 _)
| t1 < t2 = LT
| t1 == t2 = EQ
| otherwise = GT
-- Exercise 5
sortMessages :: [LogMessage] -> [LogMessage]
sortMessages messages = sortBy compareMsgs messages
-- Exercise 6
criticalError :: LogMessage -> Bool
criticalError (LogMessage (Error level) _ _)
| level >= 50 = True
| otherwise = False
criticalError (LogMessage _ _ _) = False
errorMessage :: LogMessage -> String
errorMessage (LogMessage _ _ message) = message
whatWentWrong :: [LogMessage] -> [String]
whatWentWrong messages = map errorMessage (sortMessages (filter criticalError messages))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment