built database
This commit is contained in:
@@ -3,11 +3,15 @@
|
|||||||
module Mtlstats.Types (
|
module Mtlstats.Types (
|
||||||
-- * Types
|
-- * Types
|
||||||
ProgState (..),
|
ProgState (..),
|
||||||
|
Database (..),
|
||||||
Player (..),
|
Player (..),
|
||||||
PlayerStats (..),
|
PlayerStats (..),
|
||||||
Goalie (..),
|
Goalie (..),
|
||||||
GoalieStats (..),
|
GoalieStats (..),
|
||||||
-- * Lenses
|
-- * Lenses
|
||||||
|
-- ** Database Lenses
|
||||||
|
dbPlayers,
|
||||||
|
dbGoalies,
|
||||||
-- ** Player Lenses
|
-- ** Player Lenses
|
||||||
pNumber,
|
pNumber,
|
||||||
pName,
|
pName,
|
||||||
@@ -32,6 +36,7 @@ module Mtlstats.Types (
|
|||||||
gsLosses,
|
gsLosses,
|
||||||
gsTies,
|
gsTies,
|
||||||
-- * Constructors
|
-- * Constructors
|
||||||
|
newDatabase,
|
||||||
newPlayer,
|
newPlayer,
|
||||||
newPlayerStats,
|
newPlayerStats,
|
||||||
newGoalie,
|
newGoalie,
|
||||||
@@ -58,6 +63,28 @@ import Lens.Micro.TH (makeLenses)
|
|||||||
-- | Represents the program state
|
-- | Represents the program state
|
||||||
data ProgState = ProgState
|
data ProgState = ProgState
|
||||||
|
|
||||||
|
-- | Represents the database
|
||||||
|
data Database = Database
|
||||||
|
{ _dbPlayers :: [Player]
|
||||||
|
-- ^ The list of players
|
||||||
|
, _dbGoalies :: [Goalie]
|
||||||
|
-- ^ The lidt of goalies
|
||||||
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
instance FromJSON Database where
|
||||||
|
parseJSON = withObject "Database" $ \v -> Database
|
||||||
|
<$> v .: "players"
|
||||||
|
<*> v .: "goalies"
|
||||||
|
|
||||||
|
instance ToJSON Database where
|
||||||
|
toJSON (Database ps gs) = object
|
||||||
|
[ "players" .= ps
|
||||||
|
, "goalies" .= gs
|
||||||
|
]
|
||||||
|
toEncoding (Database ps gs) = pairs $
|
||||||
|
"players" .= ps <>
|
||||||
|
"goalies" .= gs
|
||||||
|
|
||||||
-- | Represents a (non-goalie) player
|
-- | Represents a (non-goalie) player
|
||||||
data Player = Player
|
data Player = Player
|
||||||
{ _pNumber :: Int
|
{ _pNumber :: Int
|
||||||
@@ -201,11 +228,19 @@ instance ToJSON GoalieStats where
|
|||||||
"losses" .= l <>
|
"losses" .= l <>
|
||||||
"ties" .= t
|
"ties" .= t
|
||||||
|
|
||||||
|
makeLenses ''Database
|
||||||
makeLenses ''Player
|
makeLenses ''Player
|
||||||
makeLenses ''PlayerStats
|
makeLenses ''PlayerStats
|
||||||
makeLenses ''Goalie
|
makeLenses ''Goalie
|
||||||
makeLenses ''GoalieStats
|
makeLenses ''GoalieStats
|
||||||
|
|
||||||
|
-- | Constructor for a 'Database'
|
||||||
|
newDatabase :: Database
|
||||||
|
newDatabase = Database
|
||||||
|
{ _dbPlayers = []
|
||||||
|
, _dbGoalies = []
|
||||||
|
}
|
||||||
|
|
||||||
-- | Constructor for a 'Player'
|
-- | Constructor for a 'Player'
|
||||||
newPlayer
|
newPlayer
|
||||||
:: Int
|
:: Int
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ spec = describe "Mtlstats.Types" $ do
|
|||||||
pPointsSpec
|
pPointsSpec
|
||||||
playerSpec
|
playerSpec
|
||||||
goalieSpec
|
goalieSpec
|
||||||
|
databaseSpec
|
||||||
|
|
||||||
pPointsSpec :: Spec
|
pPointsSpec :: Spec
|
||||||
pPointsSpec = describe "pPoints" $ mapM_
|
pPointsSpec = describe "pPoints" $ mapM_
|
||||||
@@ -55,6 +56,17 @@ goalieSpec = describe "Goalie" $ do
|
|||||||
it "should encode" $
|
it "should encode" $
|
||||||
decode (encode goalie) `shouldBe` Just goalie
|
decode (encode goalie) `shouldBe` Just goalie
|
||||||
|
|
||||||
|
databaseSpec :: Spec
|
||||||
|
databaseSpec = describe "Database" $ do
|
||||||
|
|
||||||
|
describe "decode" $
|
||||||
|
it "should decode" $
|
||||||
|
decode dbJSON `shouldBe` Just db
|
||||||
|
|
||||||
|
describe "encode" $
|
||||||
|
it "should encode" $
|
||||||
|
decode (encode db) `shouldBe` Just db
|
||||||
|
|
||||||
player :: Player
|
player :: Player
|
||||||
player = newPlayer 1 "Joe" "centre"
|
player = newPlayer 1 "Joe" "centre"
|
||||||
& pYtd . psGoals .~ 2
|
& pYtd . psGoals .~ 2
|
||||||
@@ -81,6 +93,11 @@ goalie = newGoalie 1 "Joe"
|
|||||||
& gLifetime . gsLosses .~ 14
|
& gLifetime . gsLosses .~ 14
|
||||||
& gLifetime . gsTies .~ 15
|
& gLifetime . gsTies .~ 15
|
||||||
|
|
||||||
|
db :: Database
|
||||||
|
db = newDatabase
|
||||||
|
& dbPlayers .~ [player]
|
||||||
|
& dbGoalies .~ [goalie]
|
||||||
|
|
||||||
playerJSON :: ByteString
|
playerJSON :: ByteString
|
||||||
playerJSON = [r|
|
playerJSON = [r|
|
||||||
{ "number": 1
|
{ "number": 1
|
||||||
@@ -121,3 +138,11 @@ goalieJSON = [r|
|
|||||||
, "ties": 15
|
, "ties": 15
|
||||||
}
|
}
|
||||||
}|]
|
}|]
|
||||||
|
|
||||||
|
dbJSON :: ByteString
|
||||||
|
dbJSON = [r|
|
||||||
|
{ "players":
|
||||||
|
[ |] <> playerJSON <> [r| ]
|
||||||
|
, "goalies":
|
||||||
|
[ |] <> goalieJSON <> [r| ]
|
||||||
|
}|]
|
||||||
|
|||||||
Reference in New Issue
Block a user