sig
  val rps_round : string -> string -> int
  type move = Rock | Paper | Scissors
  type result = AWin | BWin | Draw
  val rps_round_enum : Ps1.move -> Ps1.move -> Ps1.result
  val rps_round_nested_match : Ps1.move -> Ps1.move -> Ps1.result
  val rps_round_single_match : Ps1.move -> Ps1.move -> Ps1.result
  val rps_round_with_helper : Ps1.move -> Ps1.move -> Ps1.result
  val all_pairs : 'a list -> ('a * 'a) list
  val test_rps_eq :
    (Ps1.move -> Ps1.move -> Ps1.result) ->
    (Ps1.move -> Ps1.move -> Ps1.result) -> bool
  val test_all_rps : (Ps1.move -> Ps1.move -> Ps1.result) list -> bool
  type history = Ps1.move list
  type player = Ps1.history -> Ps1.move
  val always_rock : Ps1.player
  val beats_last : Ps1.player
  val always_plays : Ps1.move -> Ps1.player
  val rps_game : Ps1.player -> Ps1.player -> bool
  val pair_filter : ('-> '-> 'a) -> 'a list -> 'a list
  val tournament : ('-> '-> 'a) -> 'a list -> 'a option
end