sig
  type comparison = int
  val cmp_fasc : ('-> 'comparable) -> '-> '-> comparison
  val cmp_fdesc : ('-> 'comparable) -> '-> '-> comparison
  val maxf : ('-> 'comparable) -> '-> '-> 'a
  val minf : ('-> 'comparable) -> '-> '-> 'a
  val in_order : 'a list -> cmp:('-> '-> comparison) -> bool
  val max_len : key:('-> string) -> 'a array -> comparison
  val bsearch :
    f:(comparison -> comparison) ->
    low:comparison -> high:comparison -> comparison option
  val bsearch_opt :
    f:(comparison -> comparison) ->
    low:comparison -> high:comparison -> comparison option
  val bsearch_exn :
    f:(comparison -> comparison) ->
    low:comparison -> high:comparison -> comparison
  type poly_comparison = [ `Good | `High | `Low ]
  val bsearch2 :
    f:(comparison -> poly_comparison) ->
    low:comparison -> high:comparison -> comparison option
  val bsearch2_opt :
    f:(comparison -> poly_comparison) ->
    low:comparison -> high:comparison -> comparison option
  val bsearch2_exn :
    f:(comparison -> poly_comparison) ->
    low:comparison -> high:comparison -> comparison
  val bsearch_val :
    f:(comparison -> comparison * 'a) ->
    low:comparison -> high:comparison -> (comparison * 'a) option
  val bsearch_val_opt :
    f:(comparison -> comparison * 'a) ->
    low:comparison -> high:comparison -> (comparison * 'a) option
  val bsearch_val_exn :
    f:(comparison -> comparison * 'a) ->
    low:comparison -> high:comparison -> comparison * 'a
end