1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type t = { id : int; name : string; rack : Rack.t; score : int }
[@@deriving yojson { exn = true }]
let make ?(rack = Rack.empty) ?(score = 0) id name = { id; name; rack; score }
let set_id player id = { player with id }
let get_id player = player.id
let set_name player name = { player with name }
let get_name player = player.name
let set_rack player rack = { player with rack }
let get_rack player = player.rack
let set_score player score = { player with score }
let get_score player = player.score
let add_points player pts = { player with score = player.score + pts }
let remove_tiles_from_rack rack tiles_to_remove =
let rec remove rack remaining =
match remaining with
| [] -> Some rack
| t :: rest -> (
match Rack.remove_once Tile.equal t rack with
| None -> None
| Some smaller -> remove smaller rest)
in
match remove rack tiles_to_remove with
| None -> rack
| Some updated -> updated