# Module Search_foo

    module Search_foo: sig .. end

    type comparison = int

    val cmp_fasc : ('a -> 'comparable) -> 'a -> 'a -> comparison

    val cmp_fdesc : ('a -> 'comparable) -> 'a -> 'a -> comparison

    val maxf : ('a -> 'comparable) -> 'a -> 'a -> 'a

    val minf : ('a -> 'comparable) -> 'a -> 'a -> 'a

    val in_order : 'a list -> cmp:('a -> 'a -> comparison) -> bool

    val max_len : key:('a -> string) -> 'a array -> int

    val bsearch : f:(int -> comparison) -> low:int -> high:int -> int option

    val bsearch_opt : f:(int -> comparison) -> low:int -> high:int -> int option

    val bsearch_exn : f:(int -> comparison) -> low:int -> high:int -> int

    type poly_comparison = [ `Good | `High | `Low ]

    val bsearch2 : f:(int -> poly_comparison) -> low:int -> high:int -> int option

    val bsearch2_opt : f:(int -> poly_comparison) -> low:int -> high:int -> int option

    val bsearch2_exn : f:(int -> poly_comparison) -> low:int -> high:int -> int

    val bsearch_val : f:(int -> comparison * 'a) ->
           low:int -> high:int -> (int * 'a) option

    val bsearch_val_opt : f:(int -> comparison * 'a) ->
           low:int -> high:int -> (int * 'a) option

    val bsearch_val_exn : f:(int -> comparison * 'a) -> low:int -> high:int -> int * 'a