xp_earnings,
xp_fracpart_only_double,
xp_gamedate,
+ xp_tba_int,
xp_tba_time,
xp_time,
xp_time_dots,
from_time (Just t) = formatTime defaultTimeLocale time_format t
+-- | (Un)pickle a 'Int', allowing for a value of \"TBA\" (which gets
+-- translated to 'Nothing').
+--
+-- /Examples/:
+--
+-- A failed parse will return 'Nothing':
+--
+-- >>> let tn = text_node "YO"
+-- >>> unpickleDoc xp_tba_int tn
+-- Just Nothing
+--
+-- And so will parsing a \"TBA\":
+--
+-- >>> let tn = text_node "TBA"
+-- >>> unpickleDoc xp_tba_int tn
+-- Just Nothing
+--
+-- But re-pickling 'Nothing' gives only \"TBA\":
+--
+-- >>> pickleDoc xp_tba_int Nothing
+-- NTree (XTag "/" []) [NTree (XText "TBA") []]
+--
+-- A normal integer is also parsed successfully, of course:
+--
+-- >>> let tn = text_node "110"
+-- >>> unpickleDoc xp_tba_int tn
+-- Just (Just 110)
+--
+xp_tba_int :: PU (Maybe Int)
+xp_tba_int =
+ (to_int, from_int) `xpWrap` xpText
+ where
+ to_int :: String -> Maybe Int
+ to_int = readMaybe
+
+ from_int :: Maybe Int -> String
+ from_int Nothing = "TBA"
+ from_int (Just t) = show t
+
+
-- | (Un)pickle the \<time_stamp\> element format to/from a 'UTCTime'.
-- The time_stamp elements look something like,
import TSN.Codegen (
tsn_codegen_config )
import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate )
-import TSN.Picklers ( xp_date_padded, xp_tba_time, xp_time_stamp )
+import TSN.Picklers ( xp_date_padded, xp_tba_int, xp_tba_time, xp_time_stamp )
import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) )
import Xml (
Child(..),
db_track_name :: String,
db_location :: String,
db_tv_listing :: Maybe String,
- db_laps :: Int,
+ db_laps :: Maybe Int,
db_track_length :: String -- ^ Sometimes the word "miles" shows up.
}
xml_track_name :: String,
xml_location :: String,
xml_tv_listing :: Maybe String,
- xml_laps :: Int,
+ xml_laps :: Maybe Int,
xml_track_length :: String, -- ^ Sometimes the word \"miles\" shows up,
-- so we can't do the right thing and use
-- a 'Double'.
(xpElem "TrackName" xpText)
(xpElem "Location" xpText)
(xpElem "TV_Listing" $ xpOption xpText)
- (xpElem "Laps" xpInt)
+ (xpElem "Laps" xp_tba_int)
(xpElem "TrackLength" xpText)
(xpList pickle_race_results)
where