X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FTSN%2FTeam.hs;h=2f58acf6de5817903e37643a194158bb0842ff02;hb=3a8d465bcc6f36b6e7601cf1902e575171aa7beb;hp=97e36475e59c14ea93c64a819e5b275b121bdd87;hpb=adfab819cdeb2774e811f68f4c7dda7668b1fa77;p=dead%2Fhtsn-import.git diff --git a/src/TSN/Team.hs b/src/TSN/Team.hs index 97e3647..2f58acf 100644 --- a/src/TSN/Team.hs +++ b/src/TSN/Team.hs @@ -13,18 +13,27 @@ -- representation. -- module TSN.Team ( + HTeam(..), + FromXmlFkTeams(..), Team(..), + VTeam(..), -- * WARNING: these are private but exported to silence warnings TeamConstructor(..) ) where -- System imports import Database.Groundhog () -- Required for some String instance +import Database.Groundhog.Core ( PersistEntity(..) ) import Database.Groundhog.TH ( defaultCodegenConfig, groundhog, mkPersist ) +-- Local imports +import Xml ( Child(..), Db(..) ) + + +-- * Team -- | The database representation of a team. The 'team_id' is a -- 'String' field because some teams do in fact have ids like @@ -43,6 +52,24 @@ data Team = deriving (Eq, Show) +-- * VTeam / HTeam + +-- | A wrapper around 'Team' that lets us distinguish between home and +-- away teams. See also 'HTeam'. \"V\" (visiting) was chosen instead +-- of \"A\" (away) simply because \"vteam\" looks better than +-- \"ateam\". This is purely for type-safety. +-- +newtype VTeam = VTeam { vteam :: Team } deriving (Eq, Show) + + +-- | A wrapper around 'Team' that lets us distinguish between home and +-- away teams. See also 'VTeam'. This is purely for type-safety. +-- +newtype HTeam = HTeam { hteam :: Team } deriving (Eq, Show) + + +-- * Database stuff + -- Generate the Groundhog code for 'Team'. mkPersist defaultCodegenConfig [groundhog| - entity: Team @@ -54,3 +81,20 @@ mkPersist defaultCodegenConfig [groundhog| type: constraint fields: [team_id] |] + + + +-- | A further refinement of 'FromXmlFk'. These types need not only a +-- foreign key to a parent in order to make the XML -> DB +-- conversion, but also two foreign keys to away/home teams (as +-- represented in "TSN.Team"). +-- +class (Child a, ToDb a) => FromXmlFkTeams a where + -- | The function that produces a @Db a@ out of a parent foreign + -- key, two team foreign keys, and an @a@. The parameter order makes + -- it easier to map this function over a bunch of things. + from_xml_fk_teams :: DefaultKey (Parent a) + -> DefaultKey Team -- ^ The away team FK + -> DefaultKey Team -- ^ The home team FK + -> a + -> Db a