diff options
Diffstat (limited to '')
-rw-r--r-- | server/lib/Cafp/Game.hs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/server/lib/Cafp/Game.hs b/server/lib/Cafp/Game.hs new file mode 100644 index 0000000..a5f367a --- /dev/null +++ b/server/lib/Cafp/Game.hs @@ -0,0 +1,40 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +module Cafp.Game + ( PlayerId + , Game (..) + + , newGame + , joinGame + , leaveGame + + , gameViewForPlayer + ) where + +import Cafp.Messages +import qualified Data.HashMap.Strict as HMS +import Data.Text (Text) +import qualified Data.Text as T + +type PlayerId = Int + +data Game = Game + { gamePlayers :: !(HMS.HashMap Int Text) + , gameNextPlayerId :: !Int + } deriving (Show) + +newGame :: Game +newGame = Game HMS.empty 1 + +joinGame :: Game -> (PlayerId, Game) +joinGame game@Game {..} = + let pid = gameNextPlayerId + name = "Player " <> T.pack (show pid) + players = HMS.insert pid name gamePlayers in + (pid, game {gameNextPlayerId = pid + 1, gamePlayers = players}) + +leaveGame :: PlayerId -> Game -> Game +leaveGame pid game = game {gamePlayers = HMS.delete pid $ gamePlayers game} + +gameViewForPlayer :: PlayerId -> Game -> GameView +gameViewForPlayer _ = GameView . map snd . HMS.toList . gamePlayers |