--
module TSN.Picklers (
xp_date,
+ xp_date_padded,
+ xp_earnings,
xp_gamedate,
+ xp_racedate,
xp_tba_time,
xp_time,
xp_time_stamp )
where
-- System imports.
+import Data.String.Utils ( replace )
import Data.Time.Clock ( NominalDiffTime, UTCTime, addUTCTime )
import Data.Time.Format ( formatTime, parseTime )
import System.Locale ( defaultTimeLocale )
time_stamp_format )
+-- | The format string for a base date in m/d/yyyy format. The
+-- day/month are not padded at all. This will match for example,
+--
+-- * 2/15/1983
+-- * 1/1/0000
+--
+date_format :: String
+date_format = "%-m/%-d/%Y"
+
+
+-- | The format string for a base date in mm/dd/yyyy format. The
+-- day/month are padded to two characters with zeros. This will
+-- match for example,
+--
+-- * 02/15/1983
+-- * 01/01/0000
+--
+date_format_padded :: String
+date_format_padded = "%0m/%0d/%Y"
+
+
-- | (Un)pickle a UTCTime without the time portion.
--
xp_date :: PU UTCTime
xp_date =
(to_date, from_date) `xpWrapMaybe` xpText
where
- format = "%-m/%-d/%Y"
+ to_date :: String -> Maybe UTCTime
+ to_date = parseTime defaultTimeLocale date_format
+
+ from_date :: UTCTime -> String
+ from_date = formatTime defaultTimeLocale date_format
+
+-- | (Un)pickle a UTCTime without the time portion. The day/month are
+-- padded to two characters with zeros.
+--
+xp_date_padded :: PU UTCTime
+xp_date_padded =
+ (to_date, from_date) `xpWrapMaybe` xpText
+ where
to_date :: String -> Maybe UTCTime
- to_date = parseTime defaultTimeLocale format
+ to_date = parseTime defaultTimeLocale date_format_padded
from_date :: UTCTime -> String
- from_date = formatTime defaultTimeLocale format
+ from_date = formatTime defaultTimeLocale date_format_padded
+
+
+-- | Parse \<Earnings\> from an 'AutoRaceResultsListing'. These are
+-- essentially 'Int's, but they look like,
+--
+-- * <Earnings>336,826</Earnings>
+-- * <Earnings>1,000,191</Earnings>
+-- * <Earnings>TBA</Earnings>
+--
+xp_earnings :: PU (Maybe Int)
+xp_earnings =
+ (to_earnings, from_earnings) `xpWrap` xpText
+ where
+ strip_commas :: String -> String
+ strip_commas = replace "," ""
+
+ to_earnings :: String -> Maybe Int
+ to_earnings s
+ | s == "TBA" = Nothing
+ | otherwise = (read . strip_commas . show) s
+
+ from_earnings :: Maybe Int -> String
+ from_earnings Nothing = ""
+ from_earnings (Just i) = show i
+
+
+-- | (Un)pickle a 'UTCTime' from a \<RaceDate\> element in an
+-- 'AutoRaceResults' message.
+--
+-- Example:
+--
+-- <RaceDate>6/1/2014 1:00:00 PM</RaceDate>
+-- <RaceDate>5/24/2014 2:45:00 PM</RaceDate>
+--
+xp_racedate :: PU UTCTime
+xp_racedate =
+ (to_racedate, from_racedate) `xpWrapMaybe` xpText
+ where
+ format = date_format ++ " " ++ "%-I:%M:%S %p"
+
+ to_racedate :: String -> Maybe UTCTime
+ to_racedate = parseTime defaultTimeLocale format
+
+ from_racedate :: UTCTime -> String
+ from_racedate = formatTime defaultTimeLocale format
-- | (Un)pickle a UTCTime from a weather forecast's gamedate. Example