1 {-# LANGUAGE DeriveGeneric #-}
2 {-# LANGUAGE DeriveDataTypeable #-}
3 {-# LANGUAGE FlexibleInstances #-}
5 {-# LANGUAGE QuasiQuotes #-}
6 {-# LANGUAGE RecordWildCards #-}
7 {-# LANGUAGE TemplateHaskell #-}
8 {-# LANGUAGE TypeFamilies #-}
10 -- | Parse TSN XML for the DTD \"MLB_Boxscore_XML.dtd\".
12 module TSN.XML.MLBBoxScore (
16 -- auto_racing_results_tests,
17 -- * WARNING: these are private but exported to silence warnings
18 MLBBoxScore_MLBBoxScoreTeamBreakdownConstructor(..),
19 MLBBoxScoreConstructor(..),
20 MLBBoxScoreHomerunStatsListingConstructor(..),
21 MLBBoxScoreHomerunStatsListingPitcherConstructor(..),
22 MLBBoxScoreMiscellaneousGameInfo(..),
23 MLBBoxScoreMiscPitchingStats(..), -- can go eventually
24 MLBBoxScoreRunsByInningsConstructor(..),
25 MLBBoxScoreTeamBreakdownConstructor(..),
26 MLBBoxScoreTeamSummary(..) -- can go eventually
31 import Control.Monad ( forM_ )
32 import Data.Data ( Data )
33 import Data.Maybe ( fromMaybe )
34 import Data.Time ( UTCTime(..) )
35 import Data.Tuple.Curry ( uncurryN )
36 import Data.Typeable ( Typeable )
37 import Database.Groundhog (
41 import Database.Groundhog.Core ( DefaultKey )
42 import Database.Groundhog.TH (
45 import qualified GHC.Generics as GHC ( Generic )
46 import Text.XML.HXT.Core (
62 import Generics ( Generic(..), to_tuple )
63 import TSN.Codegen ( tsn_codegen_config )
64 import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate )
69 import TSN.Team ( Team(..), FromXmlFkTeams(..) )
70 import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) )
78 -- | The DTD to which this module corresponds. Used to invoke dbimport.
81 dtd = "MLB_Boxscore_XML.dtd"
84 -- * DB/XML data types
87 -- MLBBoxScore/Message
89 -- | Database representation of a 'Message'. The vteam/hteam have been
90 -- removed since they use the TSN.Team representation. The
91 -- 'xml_game_date' and 'xml_game_time' fields have also been
92 -- combined into 'db_game_time'. Finally, the summaries are missing
93 -- since they'll be keyed to us.
97 db_xml_file_id :: Int,
99 db_category :: String,
102 db_schedule_id :: Int,
103 db_vteam_id :: DefaultKey Team,
104 db_hteam_id :: DefaultKey Team,
106 db_season_type :: String,
107 db_game_time :: UTCTime,
108 db_game_number :: Int,
111 db_time_stamp :: UTCTime }
116 -- | XML Representation of an 'MBLBoxScore'. It has the same fields,
117 -- but in addition contains the hteam/vteams and a game_date that
118 -- will eventually be combined with the time. It also has a list of
123 xml_xml_file_id :: Int,
124 xml_heading :: String,
125 xml_category :: String,
128 xml_schedule_id :: Int,
131 xml_vteam_id :: String,
132 xml_hteam_id :: String,
133 xml_season :: String,
134 xml_season_type :: String,
136 xml_game_date :: UTCTime,
137 xml_game_time :: UTCTime,
138 xml_game_number :: Int,
140 xml_game_breakdown :: MLBBoxScoreGameBreakdownXml,
141 xml_team_summaries :: [MLBBoxScoreTeamSummaryXml],
142 xml_misc_pitching_stats :: MLBBoxScoreMiscPitchingStatsXml,
143 xml_homerun_stats_listings :: Maybe [MLBBoxScoreHomerunStatsListingXml],
144 xml_miscellaneous_game_info :: MLBBoxScoreMiscellaneousGameInfoXml,
145 xml_time_stamp :: UTCTime }
146 deriving (Eq, GHC.Generic, Show)
149 -- | For 'Generics.to_tuple'.
151 instance Generic Message
153 instance ToDb Message where
154 -- | The database analogue of a 'Message' is a 'MLBBoxScore'.
156 type Db Message = MLBBoxScore
160 -- | This ugly hack allows us to make 'Message' an instance of
161 -- 'FromXmlFkTeams'. That class usually requires that its instances
162 -- have a parent, but 'Message' does not. So we declare it the
163 -- parent of itself, and then ignore it.
164 instance Child Message where
165 type Parent Message = MLBBoxScore
167 -- | The 'FromXmlFk' instance for 'Message' is required for the
168 -- 'XmlImport' instance.
169 instance FromXmlFkTeams Message where
170 -- | To convert a 'Message' to an 'MLBBoxScore', we drop the
171 -- teams/summaries and combine the date/time. Also missing are the
172 -- embedded elements game_breakdown, homerun_stats, and
173 -- miscellaneous_game_info.
175 from_xml_fk_teams _ vteam_id hteam_id Message{..} =
177 db_xml_file_id = xml_xml_file_id,
178 db_heading = xml_heading,
179 db_category = xml_category,
180 db_sport = xml_sport,
181 db_game_id = xml_game_id,
182 db_schedule_id = xml_schedule_id,
183 db_vteam_id = vteam_id,
184 db_hteam_id = hteam_id,
185 db_season = xml_season,
186 db_season_type = xml_season_type,
187 db_game_time = make_game_time,
188 db_game_number = xml_game_number,
189 db_capacity = xml_capacity,
190 db_title = xml_title,
191 db_time_stamp = xml_time_stamp }
194 UTCTime (utctDay xml_game_date) (utctDayTime xml_game_time)
197 data MLBBoxScoreTeamSummary = MLBBoxScoreTeamSummary
198 data MLBBoxScoreTeamSummaryXml = MLBBoxScoreTeamSummaryXml deriving (Eq, Show)
200 data MLBBoxScoreGameBreakdownXml =
201 MLBBoxScoreGameBreakdownXml {
202 xml_away_team :: MLBBoxScoreTeamBreakdownXml,
203 xml_home_team :: MLBBoxScoreTeamBreakdownXml }
204 deriving (Eq, GHC.Generic, Show)
206 -- | For 'Generics.to_tuple'
208 instance Generic MLBBoxScoreGameBreakdownXml
211 data MLBBoxScoreHomerunStatsListingBatter =
212 MLBBoxScoreHomerunStatsListingBatter {
213 db_batter_first_name :: String,
214 db_batter_last_name :: String,
215 db_batter_rbis :: Int,
216 db_batter_id :: Int }
217 deriving (Data, Eq, GHC.Generic, Show, Typeable)
219 -- | For 'Generics.to_tuple'
221 instance Generic MLBBoxScoreHomerunStatsListingBatter
224 data MLBBoxScoreHomerunStatsListing =
225 MLBBoxScoreHomerunStatsListing {
226 db_mlb_box_scores_id :: DefaultKey MLBBoxScore,
227 db_batter :: MLBBoxScoreHomerunStatsListingBatter, -- embedded
228 db_season_homeruns :: Int }
230 data MLBBoxScoreHomerunStatsListingXml =
231 MLBBoxScoreHomerunStatsListingXml {
232 xml_batter :: MLBBoxScoreHomerunStatsListingBatter,
233 xml_season_homeruns :: Int,
234 xml_pitchers :: [MLBBoxScoreHomerunStatsListingPitcherXml] }
235 deriving (Eq, GHC.Generic, Show)
237 -- | For 'Generics.to_tuple'
239 instance Generic MLBBoxScoreHomerunStatsListingXml
241 instance Child MLBBoxScoreHomerunStatsListingXml where
242 -- | Each 'MLBBoxScoreHomerunStatsListingXml' is contained in (i.e. has a
243 -- foreign key to) a 'MLBBoxScore'.
245 type Parent MLBBoxScoreHomerunStatsListingXml = MLBBoxScore
248 instance ToDb MLBBoxScoreHomerunStatsListingXml where
249 -- | The database representation of
250 -- 'MLBBoxScoreHomerunStatsListingXml' is
251 -- 'MLBBoxScoreHomerunStatsListing'.
253 type Db MLBBoxScoreHomerunStatsListingXml = MLBBoxScoreHomerunStatsListing
255 instance FromXmlFk MLBBoxScoreHomerunStatsListingXml where
256 -- | To convert an 'MLBBoxScoreHomerunStatsListingXml' to an
257 -- 'MLBBoxScoreHomerunStatsListing', we add the foreign key and
258 -- drop the pitchers.
260 from_xml_fk fk MLBBoxScoreHomerunStatsListingXml{..} =
261 MLBBoxScoreHomerunStatsListing {
262 db_mlb_box_scores_id = fk,
263 db_batter = xml_batter,
264 db_season_homeruns = xml_season_homeruns }
267 -- | This allows us to insert the XML representation
268 -- 'MLBBoxScoreHomerunStatsListingXml' directly.
270 instance XmlImportFk MLBBoxScoreHomerunStatsListingXml
273 data MLBBoxScoreHomerunStatsListingPitcher =
274 MLBBoxScoreHomerunStatsListingPitcher {
275 db_mlb_box_score_homerun_stats_listings_id ::
276 DefaultKey MLBBoxScoreHomerunStatsListing,
277 db_homeruns_off_pitcher :: Int,
278 db_pitcher_first_name :: String,
279 db_pitcher_last_name :: String,
280 db_pitchers_pitcher_id :: Int }
282 data MLBBoxScoreHomerunStatsListingPitcherXml =
283 MLBBoxScoreHomerunStatsListingPitcherXml {
284 xml_homeruns_off_pitcher :: Int,
285 xml_pitcher_first_name :: String,
286 xml_pitcher_last_name :: String,
287 xml_pitchers_pitcher_id :: Int }
288 deriving (Eq, GHC.Generic, Show)
290 -- | For 'Generics.to_tuple'
292 instance Generic MLBBoxScoreHomerunStatsListingPitcherXml
294 instance Child MLBBoxScoreHomerunStatsListingPitcherXml where
295 -- | Each 'MLBBoxScoreHomerunStatsListingPitcherXml' is contained in
296 -- (i.e. has a foreign key to) a 'MLBBoxScoreHomerunStatsListing'.
298 type Parent MLBBoxScoreHomerunStatsListingPitcherXml =
299 MLBBoxScoreHomerunStatsListing
302 instance ToDb MLBBoxScoreHomerunStatsListingPitcherXml where
303 -- | The database representation of
304 -- 'MLBBoxScoreHomerunStatsListingPitcherXml' is
305 -- 'MLBBoxScoreHomerunStatsListingPitcher'.
307 type Db MLBBoxScoreHomerunStatsListingPitcherXml = MLBBoxScoreHomerunStatsListingPitcher
310 instance FromXmlFk MLBBoxScoreHomerunStatsListingPitcherXml where
311 -- | To convert an 'MLBBoxScoreHomerunStatsListingPitcherXml' to an
312 -- 'MLBBoxScoreHomerunStatsListingPitcher', we add the foreign key.
314 from_xml_fk fk MLBBoxScoreHomerunStatsListingPitcherXml{..} =
315 MLBBoxScoreHomerunStatsListingPitcher {
316 db_mlb_box_score_homerun_stats_listings_id = fk,
317 db_homeruns_off_pitcher = xml_homeruns_off_pitcher,
318 db_pitcher_first_name = xml_pitcher_first_name,
319 db_pitcher_last_name = xml_pitcher_last_name,
320 db_pitchers_pitcher_id = xml_pitchers_pitcher_id }
323 -- | This allows us to insert the XML representation
324 -- 'MLBBoxScoreHomerunStatsListingPitcherXml' directly.
326 instance XmlImportFk MLBBoxScoreHomerunStatsListingPitcherXml
331 data MLBBoxScoreMiscellaneousGameInfo = MLBBoxScoreMiscellaneousGameInfo
332 data MLBBoxScoreMiscellaneousGameInfoXml = MLBBoxScoreMiscellaneousGameInfoXml
337 data MLBBoxScoreTeamBreakdown =
338 MLBBoxScoreTeamBreakdown {
342 data MLBBoxScoreTeamBreakdownXml =
343 MLBBoxScoreTeamBreakdownXml {
344 xml_runs_by_innings :: [MLBBoxScoreRunsByInningsXml],
348 deriving (Eq, GHC.Generic, Show)
351 -- | For 'Generics.to_tuple'.
352 instance Generic MLBBoxScoreTeamBreakdownXml
354 instance ToDb MLBBoxScoreTeamBreakdownXml where
355 -- | The database analogue of a 'MLBBoxScoreTeamBreakdownXml' is
356 -- a 'MLBBoxScoreTeamBreakdown'.
358 type Db MLBBoxScoreTeamBreakdownXml = MLBBoxScoreTeamBreakdown
361 -- | The 'FromXml' instance for 'MLBBoxScoreTeamBreakdownXml' is
362 -- required for the 'XmlImport' instance.
364 instance FromXml MLBBoxScoreTeamBreakdownXml where
365 -- | To convert a 'MLBBoxScoreTeamBreakdownXml' to an
366 -- 'MLBBoxScoreTeamBreakdown', we just drop the
367 -- 'xml_runs_by_innings'.
369 from_xml MLBBoxScoreTeamBreakdownXml{..} =
370 MLBBoxScoreTeamBreakdown {
373 db_errors = xml_errors }
375 instance XmlImport MLBBoxScoreTeamBreakdownXml
378 data MLBBoxScoreRunsByInnings =
379 MLBBoxScoreRunsByInnings {
380 db_mlb_box_scores_team_breakdowns_id :: DefaultKey
381 MLBBoxScoreTeamBreakdown,
382 db_runs_by_innings_inning_number :: Int,
383 db_runs_by_innings_runs :: Int }
385 data MLBBoxScoreRunsByInningsXml =
386 MLBBoxScoreRunsByInningsXml {
387 xml_runs_by_innings_inning_number :: Int,
388 xml_runs_by_innings_runs :: Int }
389 deriving (Eq, GHC.Generic, Show)
392 -- * MLBBoxScore_MLBBoxScoreTeamSummary
394 -- | Mapping between 'MLBBoxScore' records and
395 -- 'MLBBoxScoreTeamSummary' records in the database. We don't use
396 -- the names anywhere, so we let Groundhog choose them.
398 data MLBBoxScore_MLBBoxScoreTeamBreakdown =
399 MLBBoxScore_MLBBoxScoreTeamBreakdown
400 (DefaultKey MLBBoxScore)
401 (DefaultKey MLBBoxScoreTeamBreakdown) -- Away team
402 (DefaultKey MLBBoxScoreTeamBreakdown) -- Home team
406 -- | For 'Generics.to_tuple'.
408 instance Generic MLBBoxScoreRunsByInningsXml
411 instance ToDb MLBBoxScoreRunsByInningsXml where
412 -- | The database analogue of a 'MLBBoxScoreRunsByInningsXml' is
413 -- a 'MLBBoxScoreRunsByInnings'.
415 type Db MLBBoxScoreRunsByInningsXml = MLBBoxScoreRunsByInnings
418 instance Child MLBBoxScoreRunsByInningsXml where
419 -- | Each 'MLBBoxScoreRunsByInningsXml' is contained in (i.e. has a
420 -- foreign key to) a 'MLBBoxScoreTeamBreakdownXml'.
422 type Parent MLBBoxScoreRunsByInningsXml = MLBBoxScoreTeamBreakdown
425 instance FromXmlFk MLBBoxScoreRunsByInningsXml where
426 -- | To convert an 'MLBBoxScoreRunsByInningsXml' to an
427 -- 'MLBBoxScoreRunsByInnings', we add the foreign key and copy
428 -- everything else verbatim.
430 from_xml_fk fk MLBBoxScoreRunsByInningsXml{..} =
431 MLBBoxScoreRunsByInnings {
432 db_mlb_box_scores_team_breakdowns_id = fk,
433 db_runs_by_innings_inning_number = xml_runs_by_innings_inning_number,
434 db_runs_by_innings_runs = xml_runs_by_innings_runs }
437 -- | This allows us to insert the XML representation
438 -- 'MLBBoxScoreRunsByInningsXml' directly.
440 instance XmlImportFk MLBBoxScoreRunsByInningsXml
445 data MLBBoxScoreMiscPitchingStats = MLBBoxScoreMiscPitchingStats
446 data MLBBoxScoreMiscPitchingStatsXml =
447 MLBBoxScoreMiscPitchingStatsXml {
448 xml_wild_pitches :: Maybe Int,
449 xml_intentional_walks :: [MLBBoxScoreMiscPitchingStatsIntentionalWalkXml],
450 xml_hits_by_pitch :: [MLBBoxScoreMiscPitchingStatsHitByPitchXml] }
451 deriving (Eq, GHC.Generic, Show)
454 -- | For 'Generics.to_tuple'.
455 instance Generic MLBBoxScoreMiscPitchingStatsXml
458 data MLBBoxScoreMiscPitchingStatsIntentionalWalkXml =
459 MLBBoxScoreMiscPitchingStatsIntentionalWalkXml {
460 xml_iw_batter_id :: Int,
461 xml_iw_pitcher_id :: Int,
462 xml_iw_number_of_times_walked :: Int }
463 deriving (Eq, GHC.Generic, Show)
466 -- | For 'Generics.to_tuple'.
467 instance Generic MLBBoxScoreMiscPitchingStatsIntentionalWalkXml
470 data MLBBoxScoreMiscPitchingStatsHitByPitchXml =
471 MLBBoxScoreMiscPitchingStatsHitByPitchXml {
472 xml_hbp_batter_id :: Int,
473 xml_hbp_pitcher_id :: Int,
474 xml_hbp_number_of_times_hit :: Int }
475 deriving (Eq, GHC.Generic, Show)
478 -- | For 'Generics.to_tuple'.
480 instance Generic MLBBoxScoreMiscPitchingStatsHitByPitchXml
487 instance DbImport Message where
490 migrate (undefined :: MLBBoxScore)
492 -- | We insert the message.
494 -- First, get the vteam/hteam out of the XML message.
495 let vteam = Team (xml_vteam_id m) Nothing (Just $ xml_vteam m)
496 let hteam = Team (xml_hteam_id m) Nothing (Just $ xml_hteam m)
499 vteam_fk <- insert vteam
500 hteam_fk <- insert hteam
502 -- Now we can key the message to the teams/breakdowns we just
504 let db_msg = from_xml_fk_teams undefined vteam_fk hteam_fk m
505 msg_id <- insert db_msg
507 -- Next, the vteam/hteam breakdowns, also needed to construct the
508 -- main message record
509 let vteam_bd = xml_away_team $ xml_game_breakdown m
510 let hteam_bd = xml_home_team $ xml_game_breakdown m
512 vteam_bd_fk <- insert_xml vteam_bd
513 hteam_bd_fk <- insert_xml hteam_bd
515 -- Insert the runs-by-innings associated with the vteam/hteam
517 forM_ (xml_runs_by_innings vteam_bd) $ insert_xml_fk_ vteam_bd_fk
518 forM_ (xml_runs_by_innings hteam_bd) $ insert_xml_fk_ hteam_bd_fk
520 -- Now the join table record that ties the message to its two team
522 let msg__breakdown = MLBBoxScore_MLBBoxScoreTeamBreakdown
527 insert_ msg__breakdown
529 -- Now insert the homerun stats listings, keyed to the message.
530 -- They need not be present, but we're going to loop through them
531 -- all anyway, so if we have 'Nothing', we convert that to an
532 -- empty list instead. This simplifies the `forM_` code.
533 let listings = fromMaybe [] (xml_homerun_stats_listings m)
534 forM_ listings $ \listing -> do
535 -- Insert the listing itself.
536 listing_id <- insert_xml_fk msg_id listing
537 -- And all of its pitchers
538 forM_ (xml_pitchers listing) $ insert_xml_fk listing_id
540 return ImportSucceeded
544 mkPersist tsn_codegen_config [groundhog|
545 - entity: MLBBoxScore
546 dbName: mlb_box_scores
550 - name: unique_mlb_box_scores
552 # Prevent multiple imports of the same message.
553 fields: [db_xml_file_id]
556 - embedded: MLBBoxScoreHomerunStatsListingBatter
558 - name: db_batter_first_name
559 dbName: batter_first_name
560 - name: db_batter_last_name
561 dbName: batter_last_name
562 - name: db_batter_rbis
567 - entity: MLBBoxScoreHomerunStatsListing
568 dbName: mlb_box_score_homerun_stats_listings
570 - name: MLBBoxScoreHomerunStatsListing
574 - {name: batter_first_name, dbName: batter_first_name}
575 - {name: batter_last_name, dbName: batter_last_name}
576 - {name: batter_rbis, dbName: batter_rbis}
577 - {name: batter_id, dbName: batter_id}
579 - entity: MLBBoxScoreHomerunStatsListingPitcher
580 dbName: mlb_box_score_homerun_stats_listing_pitchers
582 - name: MLBBoxScoreHomerunStatsListingPitcher
584 - name: db_mlb_box_score_homerun_stats_listings_id
588 - entity: MLBBoxScoreTeamBreakdown
589 dbName: mlb_box_scores_team_breakdowns
591 - name: MLBBoxScoreTeamBreakdown
593 - entity: MLBBoxScoreRunsByInnings
594 dbName: mlb_box_scores_team_breakdowns_runs_by_innings
596 - name: MLBBoxScoreRunsByInnings
598 - name: db_mlb_box_scores_team_breakdowns_id
603 - entity: MLBBoxScore_MLBBoxScoreTeamBreakdown
604 dbName: mlb_box_scores__mlb_box_scores_team_breakdowns
606 - name: MLBBoxScore_MLBBoxScoreTeamBreakdown
608 - name: mLBBoxScore_MLBBoxScoreTeamBreakdown0
609 dbName: mlb_box_scores_id
612 - name: mLBBoxScore_MLBBoxScoreTeamBreakdown1
613 dbName: mlb_box_scores_team_breakdowns_away_team_id
616 - name: mLBBoxScore_MLBBoxScoreTeamBreakdown2
617 dbName: db_mlb_box_scores_team_breakdowns_home_team_id
628 pickle_message :: PU Message
631 xpWrap (from_tuple, to_tuple) $
632 xp23Tuple (xpElem "XML_File_ID" xpInt)
633 (xpElem "heading" xpText)
634 (xpElem "category" xpText)
635 (xpElem "sport" xpText)
636 (xpElem "game_id" xpInt)
637 (xpElem "schedule_id" xpInt)
638 (xpElem "vteam" xpText)
639 (xpElem "hteam" xpText)
640 (xpElem "vteam_id" xpText)
641 (xpElem "hteam_id" xpText)
642 (xpElem "Season" xpText)
643 (xpElem "SeasonType" xpText)
644 (xpElem "title" xpText)
645 (xpElem "Game_Date" xp_date)
646 (xpElem "Game_Time" xp_time)
647 (xpElem "GameNumber" xpInt)
648 (xpElem "Capacity" xpInt)
649 pickle_game_breakdown
650 (xpList pickle_team_summary)
651 pickle_misc_pitching_stats
652 (xpOption pickle_homerun_stats_listings)
653 pickle_miscellaneous_game_info
654 (xpElem "time_stamp" xp_time_stamp)
656 from_tuple = uncurryN Message
659 pickle_team_summary :: PU MLBBoxScoreTeamSummaryXml
660 pickle_team_summary =
661 xpElem "Team_Summary" $ xpWrap (from_tuple, to_tuple') $ xpUnit
663 from_tuple _ = MLBBoxScoreTeamSummaryXml
666 pickle_game_breakdown :: PU MLBBoxScoreGameBreakdownXml
667 pickle_game_breakdown =
668 xpElem "Game_Breakdown" $
669 xpWrap (from_tuple, to_tuple) $
670 xpPair pickle_away_team
673 from_tuple = uncurry MLBBoxScoreGameBreakdownXml
676 pickle_runs_by_innings :: PU MLBBoxScoreRunsByInningsXml
677 pickle_runs_by_innings =
678 xpElem "Runs_By_Innings" $
679 xpWrap (from_tuple, to_tuple) $
680 xpPair (xpAttr "Inning" xpInt)
683 from_tuple = uncurry MLBBoxScoreRunsByInningsXml
686 pickle_team :: PU MLBBoxScoreTeamBreakdownXml
688 xpWrap (from_tuple, to_tuple) $
689 xp4Tuple (xpList pickle_runs_by_innings)
690 (xpElem "Runs" xpInt)
691 (xpElem "Hits" xpInt)
692 (xpElem "Errors" xpInt)
694 from_tuple = uncurryN MLBBoxScoreTeamBreakdownXml
697 pickle_away_team :: PU MLBBoxScoreTeamBreakdownXml
699 xpElem "AwayTeam" pickle_team
701 pickle_home_team :: PU MLBBoxScoreTeamBreakdownXml
703 xpElem "HomeTeam" pickle_team
706 pickle_batter :: PU MLBBoxScoreHomerunStatsListingBatter
708 xpElem "HRS_Batter_ID" $
709 xpWrap (from_tuple, to_tuple) $
710 xp4Tuple (xpAttr "HRS_Batter_FirstName" $ xpText)
711 (xpAttr "HRS_Batter_LastName" $ xpText)
712 (xpAttr "RBIs" $ xpInt)
715 from_tuple = uncurryN MLBBoxScoreHomerunStatsListingBatter
718 pickle_pitcher :: PU MLBBoxScoreHomerunStatsListingPitcherXml
720 xpElem "HRS_Pitcher_ID" $
721 xpWrap (from_tuple, to_tuple) $
722 xp4Tuple (xpAttr "HRS_Homeruns_Off_Pitcher" $ xpInt)
723 (xpAttr "HRS_Pitcher_FirstName" $ xpText)
724 (xpAttr "HRS_Pitcher_LastName" $ xpText)
727 from_tuple = uncurryN MLBBoxScoreHomerunStatsListingPitcherXml
730 pickle_homerun_stats_listing :: PU MLBBoxScoreHomerunStatsListingXml
731 pickle_homerun_stats_listing =
732 xpElem "HRS_Listing" $
733 xpWrap (from_tuple, to_tuple) $
734 xpTriple pickle_batter
735 (xpElem "Season_Homeruns" xpInt)
736 (xpList pickle_pitcher)
738 from_tuple = uncurryN MLBBoxScoreHomerunStatsListingXml
741 pickle_homerun_stats_listings :: PU [MLBBoxScoreHomerunStatsListingXml]
742 pickle_homerun_stats_listings =
743 xpElem "Homerun_Stats" $ xpList pickle_homerun_stats_listing
746 pickle_misc_pitching_stats :: PU MLBBoxScoreMiscPitchingStatsXml
747 pickle_misc_pitching_stats =
748 xpElem "Misc_Pitching_Stats" $
749 xpWrap (from_tuple, to_tuple) $
750 xpTriple (xpOption $ xpElem "Wild_Pitches" xpInt)
751 pickle_intentional_walks
754 from_tuple = uncurryN MLBBoxScoreMiscPitchingStatsXml
758 pickle_intentional_walks :: PU [MLBBoxScoreMiscPitchingStatsIntentionalWalkXml]
759 pickle_intentional_walks =
760 xpElem "Intentional_Walks" $ xpList $ xpElem "IW_Listing" $
761 xpWrap (from_tuple, to_tuple) $
762 xpTriple (xpElem "IW_Batter_ID" xpInt)
763 (xpElem "IW_Pitcher_ID" xpInt)
764 (xpElem "IW_Number_Of_Times_Walked" xpInt)
766 from_tuple = uncurryN MLBBoxScoreMiscPitchingStatsIntentionalWalkXml
770 pickle_hits_by_pitch :: PU [MLBBoxScoreMiscPitchingStatsHitByPitchXml]
771 pickle_hits_by_pitch =
772 xpElem "Hit_By_Pitch" $ xpList $ xpElem "HBP_Listing" $
773 xpWrap (from_tuple, to_tuple) $
774 xpTriple (xpElem "HBP_Batter_ID" xpInt)
775 (xpElem "HBP_Pitcher_ID" xpInt)
776 (xpElem "HBP_Number_Of_Times_Hit" xpInt)
778 from_tuple = uncurryN MLBBoxScoreMiscPitchingStatsHitByPitchXml
782 pickle_miscellaneous_game_info :: PU MLBBoxScoreMiscellaneousGameInfoXml
783 pickle_miscellaneous_game_info =
784 xpElem "Miscelaneous_Game_Info" $ xpWrap (from_tuple, to_tuple') $ xpUnit
786 from_tuple _ = MLBBoxScoreMiscellaneousGameInfoXml