-
-
Save cj3kim/c0db32ba27face6fe2a7 to your computer and use it in GitHub Desktop.
module LogAnalysis where | |
import Log | |
parseMessage :: String -> LogMessage | |
parseMessage s = LogMessage messageType timestamp message | |
where wordAry = words s | |
firstChar = wordAry !! 0 | |
secondChar = wordAry !! 1 | |
messageType = case firstChar of | |
"I" -> Info | |
"W" -> Warning | |
"E" -> (Error (read secondChar :: Int)) | |
timestamp = case messageType of | |
(Error n) -> read (wordAry !! 2) :: Int | |
(Info) -> read (wordAry !! 1) :: Int | |
(Warning) -> read (wordAry !! 1) :: Int | |
message = case messageType of | |
(Error n) -> unwords (drop 3 wordAry) | |
(Info) -> unwords (drop 2 wordAry) | |
(Warning) -> unwords (drop 2 wordAry) | |
Maybe this could be a cleaner solution but I'm not sure that it works, I haven't compiled it or anything...
parseMessage :: String -> LogMessage
parseMessage ('I' : t : m) = LogMessage Info t m
parseMessage ('W' : t : m) = LogMessage Warning t m
parseMessage ('E' : e : t : m) = LogMessage (Error e) t m
use pattern matching
bemkap has joined (~[email protected])
whiteline
but use -Wall so you don't forget to add defaults
jonmorehouse has left IRC (Ping timeout: 246 seconds)
mtakkman has left IRC (Ping timeout: 256 seconds)
tedkornish
Since you're not reusing firstChar, you can inline it
joneshf-laptop
cj3kim, This isn't really a refactoring comment, but what about the failure case: Unknown
?
tedkornish
So you can say case head wordAry of
Natch has left IRC (Ping timeout: 252 seconds)
mmachenry1 has joined ([email protected])
kadoban has joined (~mud@unaffiliated/kadoban)
cj3kim
ah, good point
Welkin
cj3kim: use words
on the input, the pattern match on the three cases
11:08 Welkin
call unwords
on the message
okay, I will look more into pattern matching
husanu has left IRC (Remote host closed the connection)
reindeernix
why shouldn't you use !!?
husanu has joined ([email protected])
joneshf-laptop
partial
obb has left IRC (Remote host closed the connection)
cj3kim
and then come back when I'm done
whiteline
well, it's ugly. also, you're traversing a structure twice.
machine_coder has joined (~[email protected])
joneshf-laptop
[1,2,3] !! 10
lambdabot
*Exception: Prelude.!!: index too large
dan_f has joined (~[email protected])
whiteline
no idea if the compiler optimizes that away though
r4yan2 has left IRC (Ping timeout: 264 seconds)
whiteline
yeah, and patterns can catch size issues w/otherwise
vkosdll has joined (68833a8a@gateway/web/freenode/ip.104.131.58.138)
tristanp has left IRC (Remote host closed the connection)
Welkin
parseMessage i = case words i of ('E' : code : line : msg) -> LogMessage (Error code) line (words msg)
Welkin
er
Welkin
unwords msg
-- CIS 194 Homework 2
module Log where
import Control.Applicative
data MessageType = Info
| Warning
| Error Int
deriving (Show, Eq)
type TimeStamp = Int
data LogMessage = LogMessage MessageType TimeStamp String
| Unknown String
deriving (Show, Eq)
data MessageTree = Leaf
| Node MessageTree LogMessage MessageTree
deriving (Show, Eq)
-- | @testParse p n f@ tests the log file parser @p@ by running it
-- on the first @n@ lines of file @f@.
testParse :: (String -> [LogMessage])
-> Int
-> FilePath
-> IO [LogMessage]
testParse parse n file = take n . parse <$> readFile file
-- | @testWhatWentWrong p w f@ tests the log file parser @p@ and
-- warning message extractor @w@ by running them on the log file
-- @f@.
testWhatWentWrong :: (String -> [LogMessage])
-> ([LogMessage] -> [String])
-> FilePath
-> IO [String]
testWhatWentWrong parse whatWentWrong file
= whatWentWrong . parse <$> readFile file