sig
  type ('input, 'output) case = {
    pattern : 'input list;
    documentation : string;
    value : 'output;
  }
  type ('input, 'output) t = {
    specific_cases :
      ('input, unit -> 'output) Documented_match_statement.case list;
    catchall_case :
      [ `Unused of unit -> 'output
      | `Used of
          ([ `Catchall ], 'input -> 'output) Documented_match_statement.case ];
  }
  val map :
    ('input, 'output1) Documented_match_statement.t ->
    f:('output1 -> 'output2) ->
    ('input, 'output2) Documented_match_statement.t
  val map_case :
    ('input, unit -> 'output1) Documented_match_statement.case ->
    f:('output1 -> 'output2) ->
    ('input, unit -> 'output2) Documented_match_statement.case
  val map_cases :
    ('input, unit -> 'output1) Documented_match_statement.case list ->
    f:('output1 -> 'output2) ->
    ('input, unit -> 'output2) Documented_match_statement.case list
  val map_pattern :
    ('input1, 'output) Documented_match_statement.t ->
    f1:('input1 -> 'input2) ->
    f2:('input2 -> 'input1) ->
    ('input2, 'output) Documented_match_statement.t
  val prepend :
    specific_cases:('input, unit -> 'output) Documented_match_statement.case
                   list ->
    ('input, 'output) Documented_match_statement.t ->
    ('input, 'output) Documented_match_statement.t
  val match_ :
    ('input, 'output) Documented_match_statement.t -> 'input -> 'output
  val documentation :
    ('input, 'output) Documented_match_statement.t ->
    input_to_string:('input -> string) -> title:string -> string list
end