From: Michael Orlitzky Date: Tue, 10 Apr 2012 22:36:06 +0000 (-0400) Subject: Add the new reply/retweet fields to Status. X-Git-Url: https://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=ec4132ae41860a77f97b382acad5cf45b117e75d;p=dead%2Fhalcyon.git Add the new reply/retweet fields to Status. Take advantage of the Maybe monad in the status_from_content function. Reformat a test case. --- diff --git a/src/Twitter/Status.hs b/src/Twitter/Status.hs index 01ef0ab..3414d7c 100644 --- a/src/Twitter/Status.hs +++ b/src/Twitter/Status.hs @@ -20,47 +20,59 @@ import Twitter.Xml data Status = Status { status_id :: Integer, created_at :: String, text :: String, - user :: User } + user :: User, + reply :: Bool, + retweet :: Bool } deriving (Show, Eq) -- |Given some XML content, create a 'Status' from it. -status_from_content :: Content i -> (Maybe Status) +status_from_content :: Content i -> Maybe Status status_from_content content = - if (length status_ids) == 0 || (length created_ats) == 0 || (length texts) == 0 || (length users) == 0 + || (length retweeteds) == 0 then Nothing - else - case first_status_id of - Nothing -> Nothing - (Just status_id_data) -> - case first_created_at of - Nothing -> Nothing - (Just created_at_data) -> - case first_user of - Nothing -> Nothing - (Just user_object) -> - case (reads status_id_data :: [(Integer, String)]) of - [] -> Nothing - parseresult:_ -> Just (Status (fst parseresult) created_at_data all_text user_object) - + else do + first_status_id <- get_char_data (status_ids !! 0) + integer_status_id <- parse_status_id first_status_id + first_created_at <- get_char_data (created_ats !! 0) + first_user <- user_from_content (users !! 0) + first_retweeted <- get_char_data (retweeteds !! 0) + + let is_reply = case (length reply_to_status_ids) of + 0 -> False + _ -> True + + let is_retweet = case first_retweeted of + "true" -> True + _ -> False + + return (Status + integer_status_id + first_created_at + all_text + first_user + is_reply + is_retweet) where status_ids = (unique_id content) - first_status_id = get_char_data (status_ids !! 0) - created_ats = (status_created_at content) - first_created_at = get_char_data (created_ats !! 0) - texts = (status_text content) - all_text = concat $ catMaybes (map get_char_data texts) - users = (status_user content) - first_user = user_from_content (users !! 0) + retweeteds = (status_retweeted content) + reply_to_status_ids = (status_reply_to_status_id content) + + all_text = concat $ catMaybes (map get_char_data texts) + parse_status_id :: String -> Maybe Integer + parse_status_id s = + case (reads s) of + [] -> Nothing + parseresult:_ -> Just (fst parseresult) -- |Takes an XML String as an argument, and returns the -- status that was parsed from it. Should only be used @@ -169,13 +181,20 @@ status_tests = [ test_parse_usernames ] test_parse_usernames :: Test test_parse_usernames = - TestCase $ assertEqual "All usernames are parsed." expected_usernames actual_usernames + TestCase $ + assertEqual + "All usernames are parsed." + expected_usernames + actual_usernames where dummy_user = User { screen_name = "nobody" } dummy_status = Status { status_id = 1, created_at = "never", text = "Hypothesis: @donsbot and @bonus500 are two personalities belonging to the same person.", - user = dummy_user } - + user = dummy_user, + reply = False, + retweet = False + } + actual_usernames = parse_usernames_from_status dummy_status expected_usernames = ["donsbot", "bonus500"]