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