gameServer/RoomsAndClients.hs
author nemo
Thu, 01 Jul 2010 23:41:10 -0400
changeset 3608 c509bbc779e7
parent 3566 772a46ef8288
child 3645 c0b3f1bb9316
permissions -rw-r--r--
Revert prior attempted optimisation. Gridding the land pays in some situations, but not all. Restricting to an upper bound might help, but overall, seems too fuzzy to be worth it. On one side is increased cost of Add/Delete + extra test on collision check, on the other is skipping the list iteration. Perhaps for large lists.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
     1
module RoomsAndClients(
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
     2
    RoomIndex(),
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
     3
    ClientIndex(),
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
     4
    MRoomsAndClients(),
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
     5
    IRoomsAndClients(),
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
     6
    newRoomsAndClients,
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
     7
    addRoom,
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
     8
    addClient,
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
     9
    removeRoom,
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    10
    removeClient,
3436
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
    11
    modifyRoom,
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
    12
    modifyClient,
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    13
    lobbyId,
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    14
    moveClientToLobby,
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    15
    moveClientToRoom,
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    16
    clientRoom,
3436
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
    17
    clientRoomM,
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    18
    client,
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
    19
    room,
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
    20
    client'sM,
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3436
diff changeset
    21
    clientsM,
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    22
    roomClientsM,
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
    23
    withRoomsAndClients,
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
    24
    allRooms,
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    25
    allClients,
3555
4c5ca656d1bb Reimplement ADD_TEAM
unc0rr
parents: 3502
diff changeset
    26
    clientRoom,
3435
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
    27
    showRooms,
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
    28
    roomClients
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    29
    ) where
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    30
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    31
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    32
import Store
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    33
import Control.Monad
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    34
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    35
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    36
data Room r = Room {
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    37
    roomClients' :: [ClientIndex],
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    38
    room' :: r
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    39
    }
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    40
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    41
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    42
data Client c = Client {
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    43
    clientRoom' :: RoomIndex,
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    44
    client' :: c
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    45
    }
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    46
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    47
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    48
newtype RoomIndex = RoomIndex ElemIndex
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    49
    deriving (Eq)
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    50
newtype ClientIndex = ClientIndex ElemIndex
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3555
diff changeset
    51
    deriving (Eq, Show, Read, Ord)
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    52
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    53
instance Show RoomIndex where
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    54
    show (RoomIndex i) = 'r' : show i
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    55
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    56
unRoomIndex :: RoomIndex -> ElemIndex
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    57
unRoomIndex (RoomIndex r) = r
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    58
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    59
unClientIndex :: ClientIndex -> ElemIndex
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    60
unClientIndex (ClientIndex c) = c
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    61
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    62
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    63
newtype MRoomsAndClients r c = MRoomsAndClients (MStore (Room r), MStore (Client c))
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    64
newtype IRoomsAndClients r c = IRoomsAndClients (IStore (Room r), IStore (Client c))
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    65
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    66
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    67
lobbyId :: RoomIndex
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    68
lobbyId = RoomIndex firstIndex
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    69
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    70
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    71
newRoomsAndClients :: r -> IO (MRoomsAndClients r c)
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    72
newRoomsAndClients r = do
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    73
    rooms <- newStore
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    74
    clients <- newStore
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    75
    let rnc = MRoomsAndClients (rooms, clients)
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    76
    ri <- addRoom rnc r
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    77
    when (ri /= lobbyId) $ error "Empty struct inserts not at firstIndex index"
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    78
    return rnc
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    79
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    80
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    81
roomAddClient :: ClientIndex -> Room r -> Room r
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    82
roomAddClient cl room = room{roomClients' = cl : roomClients' room}
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    83
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    84
roomRemoveClient :: ClientIndex -> Room r -> Room r
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    85
roomRemoveClient cl room = room{roomClients' = filter (/= cl) $ roomClients' room}
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    86
3435
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
    87
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    88
addRoom :: MRoomsAndClients r c -> r -> IO RoomIndex
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    89
addRoom (MRoomsAndClients (rooms, _)) room = do
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    90
    i <- addElem rooms (Room  [] room)
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    91
    return $ RoomIndex i
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    92
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    93
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    94
addClient :: MRoomsAndClients r c -> c -> IO ClientIndex
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    95
addClient (MRoomsAndClients (rooms, clients)) client = do
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    96
    i <- addElem clients (Client lobbyId client)
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
    97
    modifyElem rooms (roomAddClient (ClientIndex i)) (unRoomIndex lobbyId)
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    98
    return $ ClientIndex i
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
    99
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   100
removeRoom :: MRoomsAndClients r c -> RoomIndex -> IO ()
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   101
removeRoom rnc@(MRoomsAndClients (rooms, _)) room@(RoomIndex ri) 
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   102
    | room == lobbyId = error "Cannot delete lobby"
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   103
    | otherwise = do
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   104
        clIds <- liftM roomClients' $ readElem rooms ri
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   105
        forM_ clIds (moveClientToLobby rnc)
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   106
        removeElem rooms ri
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   107
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   108
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   109
removeClient :: MRoomsAndClients r c -> ClientIndex -> IO ()
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   110
removeClient (MRoomsAndClients (rooms, clients)) cl@(ClientIndex ci) = do
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   111
    RoomIndex ri <- liftM clientRoom' $ readElem clients ci
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   112
    modifyElem rooms (roomRemoveClient cl) ri
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   113
    removeElem clients ci
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   114
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   115
3436
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
   116
modifyRoom :: MRoomsAndClients r c -> (r -> r) -> RoomIndex -> IO ()
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
   117
modifyRoom (MRoomsAndClients (rooms, _)) f (RoomIndex ri) = modifyElem rooms (\r -> r{room' = f $ room' r}) ri
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
   118
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
   119
modifyClient :: MRoomsAndClients r c -> (c -> c) -> ClientIndex -> IO ()
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
   120
modifyClient (MRoomsAndClients (_, clients)) f (ClientIndex ci) = modifyElem clients (\c -> c{client' = f $ client' c}) ci
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
   121
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   122
moveClientInRooms :: MRoomsAndClients r c -> RoomIndex -> RoomIndex -> ClientIndex -> IO ()
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   123
moveClientInRooms (MRoomsAndClients (rooms, clients)) (RoomIndex riFrom) rt@(RoomIndex riTo) cl@(ClientIndex ci) = do
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   124
    modifyElem rooms (roomRemoveClient cl) riFrom
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   125
    modifyElem rooms (roomAddClient cl) riTo
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   126
    modifyElem clients (\c -> c{clientRoom' = rt}) ci
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   127
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   128
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   129
moveClientToLobby :: MRoomsAndClients r c -> ClientIndex -> IO ()
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   130
moveClientToLobby rnc ci = do
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   131
    room <- clientRoomM rnc ci
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   132
    moveClientInRooms rnc room lobbyId ci
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   133
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   134
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   135
moveClientToRoom :: MRoomsAndClients r c -> RoomIndex -> ClientIndex -> IO ()
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   136
moveClientToRoom rnc ri ci = moveClientInRooms rnc lobbyId ri ci
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   137
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   138
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   139
clientRoomM :: MRoomsAndClients r c -> ClientIndex -> IO RoomIndex
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   140
clientRoomM (MRoomsAndClients (_, clients)) (ClientIndex ci) = liftM clientRoom' (clients `readElem` ci)
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   141
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
   142
client'sM :: MRoomsAndClients r c -> (c -> a) -> ClientIndex -> IO a
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
   143
client'sM (MRoomsAndClients (_, clients)) f (ClientIndex ci) = liftM (f . client') (clients `readElem` ci)
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3436
diff changeset
   144
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
   145
clientsM :: MRoomsAndClients r c -> IO [c]
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
   146
clientsM (MRoomsAndClients (_, clients)) = indicesM clients >>= mapM (\ci -> liftM client' $ readElem clients ci)
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   147
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   148
roomClientsM :: MRoomsAndClients r c -> RoomIndex -> IO [c]
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   149
roomClientsM (MRoomsAndClients (rooms, clients)) (RoomIndex ri) = liftM roomClients' (rooms `readElem` ri) >>= mapM (\(ClientIndex ci) -> liftM client' $ readElem clients ci)
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   150
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   151
withRoomsAndClients :: MRoomsAndClients r c -> (IRoomsAndClients r c -> a) -> IO a
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   152
withRoomsAndClients (MRoomsAndClients (rooms, clients)) f =
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   153
    withIStore2 rooms clients (\r c -> f $ IRoomsAndClients (r, c))
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   154
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   155
----------------------------------------
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   156
----------- IRoomsAndClients -----------
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   157
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   158
showRooms :: (Show r, Show c) => IRoomsAndClients r c -> String
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   159
showRooms rnc@(IRoomsAndClients (rooms, clients)) = concatMap showRoom (allRooms rnc)
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   160
    where
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   161
    showRoom r = unlines $ ((show r) ++ ": " ++ (show $ room' $ rooms ! (unRoomIndex r))) : (map showClient (roomClients' $ rooms ! (unRoomIndex r)))
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   162
    showClient c = "    " ++ (show c) ++ ": " ++ (show $ client' $ clients ! (unClientIndex c))
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   163
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   164
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   165
allRooms :: IRoomsAndClients r c -> [RoomIndex]
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   166
allRooms (IRoomsAndClients (rooms, _)) = map RoomIndex $ indices rooms
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   167
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   168
allClients :: IRoomsAndClients r c -> [ClientIndex]
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   169
allClients (IRoomsAndClients (_, clients)) = map ClientIndex $ indices clients
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   170
3435
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
   171
clientRoom :: IRoomsAndClients r c -> ClientIndex -> RoomIndex
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
   172
clientRoom (IRoomsAndClients (_, clients)) (ClientIndex ci) = clientRoom' (clients ! ci)
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   173
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   174
client :: IRoomsAndClients r c -> ClientIndex -> c
ead2ed20dfd4 Start the server refactoring
unc0rr
parents:
diff changeset
   175
client (IRoomsAndClients (_, clients)) (ClientIndex ci) = client' (clients ! ci)
3435
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
   176
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
   177
room :: IRoomsAndClients r c -> RoomIndex -> r
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
   178
room (IRoomsAndClients (rooms, _)) (RoomIndex ri) = room' (rooms ! ri)
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3458
diff changeset
   179
3435
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
   180
roomClients :: IRoomsAndClients r c -> RoomIndex -> [ClientIndex]
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
   181
roomClients (IRoomsAndClients (rooms, _)) (RoomIndex ri) = roomClients' $ (rooms ! ri)