aboutsummaryrefslogtreecommitdiff
path: root/server/lib/Cafp/Game.hs
diff options
context:
space:
mode:
authorJasper Van der Jeugt2020-07-30 14:43:25 +0200
committerJasper Van der Jeugt2020-07-30 14:43:25 +0200
commit4e1068c41b84f0813b82fe61816271b92ca76f48 (patch)
treea0d0c0c612157a93b5c6548d61cd8103544facf3 /server/lib/Cafp/Game.hs
parent724d731227294f0b2975d66ed727aca3f89c30ab (diff)
Basic syncing
Diffstat (limited to 'server/lib/Cafp/Game.hs')
-rw-r--r--server/lib/Cafp/Game.hs40
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