player_resource/
player_resource.rs

1//! https://stackoverflow.com/questions/28418584/how-to-represent-shared-mutable-state/77399498#77399498
2
3use riddance::{Id, Registry};
4
5type PlayerId = Id<Player>;
6
7struct Player {
8    resource_ids: Vec<ResourceId>,
9    points: i32,
10}
11
12type ResourceId = Id<Resource>;
13
14struct Resource {
15    owner_id: PlayerId,
16}
17
18struct GameState {
19    players: Registry<Player>,
20    resources: Registry<Resource>,
21}
22
23fn new_player(state: &mut GameState) -> PlayerId {
24    state.players.insert(Player {
25        points: 0,
26        resource_ids: Vec::new(),
27    })
28}
29
30fn new_resource(state: &mut GameState, owner_id: PlayerId) -> ResourceId {
31    let new_id = state.resources.insert(Resource { owner_id });
32    state.players[owner_id].resource_ids.push(new_id);
33    state.players[owner_id].points += 30;
34    new_id
35}
36
37fn main() {
38    let mut state = GameState {
39        players: Registry::new(),
40        resources: Registry::new(),
41    };
42    let player_id = new_player(&mut state);
43    let resource_id = new_resource(&mut state, player_id);
44    assert_eq!(state.resources[resource_id].owner_id, player_id);
45    assert!(state.players[player_id].resource_ids.contains(&resource_id));
46}