sig
  module Tree :
    sig
      type 'a t
      val root : 'a QCheck2.Tree.t -> 'a
      val children : 'a QCheck2.Tree.t -> 'a QCheck2.Tree.t Stdlib.Seq.t
      val pp :
        ?depth:int ->
        (Stdlib.Format.formatter -> 'a -> unit) ->
        Stdlib.Format.formatter -> 'a QCheck2.Tree.t -> unit
    end
  module Gen :
    sig
      type 'a t
      type 'a sized = int -> 'a QCheck2.Gen.t
      val unit : unit QCheck2.Gen.t
      val bool : bool QCheck2.Gen.t
      val int : int QCheck2.Gen.t
      val pint : ?origin:int -> int QCheck2.Gen.t
      val small_nat : int QCheck2.Gen.t
      val nat : int QCheck2.Gen.t
      val big_nat : int QCheck2.Gen.t
      val neg_int : int QCheck2.Gen.t
      val small_int : int QCheck2.Gen.t
      val small_signed_int : int QCheck2.Gen.t
      val small_int_corners : unit -> int QCheck2.Gen.t
      val int32 : int32 QCheck2.Gen.t
      val ui32 : int32 QCheck2.Gen.t
      val int64 : int64 QCheck2.Gen.t
      val ui64 : int64 QCheck2.Gen.t
      val float : float QCheck2.Gen.t
      val pfloat : float QCheck2.Gen.t
      val nfloat : float QCheck2.Gen.t
      val char : char QCheck2.Gen.t
      val printable : char QCheck2.Gen.t
      val numeral : char QCheck2.Gen.t
      val bytes_size :
        ?gen:char QCheck2.Gen.t -> int QCheck2.Gen.t -> bytes QCheck2.Gen.t
      val bytes : bytes QCheck2.Gen.t
      val bytes_of : char QCheck2.Gen.t -> bytes QCheck2.Gen.t
      val bytes_printable : bytes QCheck2.Gen.t
      val bytes_small : bytes QCheck2.Gen.t
      val bytes_small_of : char QCheck2.Gen.t -> bytes QCheck2.Gen.t
      val string_size :
        ?gen:char QCheck2.Gen.t -> int QCheck2.Gen.t -> string QCheck2.Gen.t
      val string : string QCheck2.Gen.t
      val string_of : char QCheck2.Gen.t -> string QCheck2.Gen.t
      val string_printable : string QCheck2.Gen.t
      val string_small : string QCheck2.Gen.t
      val string_small_of : char QCheck2.Gen.t -> string QCheck2.Gen.t
      val small_string : ?gen:char QCheck2.Gen.t -> string QCheck2.Gen.t
      val pure : 'a -> 'a QCheck2.Gen.t
      val return : 'a -> 'a QCheck2.Gen.t
      val make_primitive :
        gen:(Stdlib.Random.State.t -> 'a) ->
        shrink:('a -> 'a Stdlib.Seq.t) -> 'a QCheck2.Gen.t
      val add_shrink_invariant :
        ('a -> bool) -> 'a QCheck2.Gen.t -> 'a QCheck2.Gen.t
      val set_shrink :
        ('a -> 'a Stdlib.Seq.t) -> 'a QCheck2.Gen.t -> 'a QCheck2.Gen.t
      val no_shrink : 'a QCheck2.Gen.t -> 'a QCheck2.Gen.t
      val int_bound : int -> int QCheck2.Gen.t
      val int_range : ?origin:int -> int -> int -> int QCheck2.Gen.t
      val ( -- ) : int -> int -> int QCheck2.Gen.t
      val float_bound_inclusive :
        ?origin:float -> float -> float QCheck2.Gen.t
      val float_bound_exclusive :
        ?origin:float -> float -> float QCheck2.Gen.t
      val float_range :
        ?origin:float -> float -> float -> float QCheck2.Gen.t
      val ( --. ) : float -> float -> float QCheck2.Gen.t
      val char_range : ?origin:char -> char -> char -> char QCheck2.Gen.t
      val oneof : 'a QCheck2.Gen.t list -> 'a QCheck2.Gen.t
      val oneofl : 'a list -> 'a QCheck2.Gen.t
      val oneofa : 'a array -> 'a QCheck2.Gen.t
      val frequency : (int * 'a QCheck2.Gen.t) list -> 'a QCheck2.Gen.t
      val frequencyl : (int * 'a) list -> 'a QCheck2.Gen.t
      val frequencya : (int * 'a) array -> 'a QCheck2.Gen.t
      val shuffle_a : 'a array -> 'a array QCheck2.Gen.t
      val shuffle_l : 'a list -> 'a list QCheck2.Gen.t
      val shuffle_w_l : (int * 'a) list -> 'a list QCheck2.Gen.t
      val graft_corners :
        'a QCheck2.Gen.t -> 'a list -> unit -> 'a QCheck2.Gen.t
      val int_pos_corners : int list
      val int_corners : int list
      val list : 'a QCheck2.Gen.t -> 'a list QCheck2.Gen.t
      val small_list : 'a QCheck2.Gen.t -> 'a list QCheck2.Gen.t
      val list_size :
        int QCheck2.Gen.t -> 'a QCheck2.Gen.t -> 'a list QCheck2.Gen.t
      val list_repeat : int -> 'a QCheck2.Gen.t -> 'a list QCheck2.Gen.t
      val array : 'a QCheck2.Gen.t -> 'a array QCheck2.Gen.t
      val array_size :
        int QCheck2.Gen.t -> 'a QCheck2.Gen.t -> 'a array QCheck2.Gen.t
      val small_array : 'a QCheck2.Gen.t -> 'a array QCheck2.Gen.t
      val array_repeat : int -> 'a QCheck2.Gen.t -> 'a array QCheck2.Gen.t
      val option :
        ?ratio:float -> 'a QCheck2.Gen.t -> 'a option QCheck2.Gen.t
      val opt : ?ratio:float -> 'a QCheck2.Gen.t -> 'a option QCheck2.Gen.t
      val pair :
        'a QCheck2.Gen.t -> 'b QCheck2.Gen.t -> ('a * 'b) QCheck2.Gen.t
      val triple :
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t -> 'c QCheck2.Gen.t -> ('a * 'b * 'c) QCheck2.Gen.t
      val quad :
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t ->
        'c QCheck2.Gen.t ->
        'd QCheck2.Gen.t -> ('a * 'b * 'c * 'd) QCheck2.Gen.t
      val tup2 :
        'a QCheck2.Gen.t -> 'b QCheck2.Gen.t -> ('a * 'b) QCheck2.Gen.t
      val tup3 :
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t -> 'c QCheck2.Gen.t -> ('a * 'b * 'c) QCheck2.Gen.t
      val tup4 :
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t ->
        'c QCheck2.Gen.t ->
        'd QCheck2.Gen.t -> ('a * 'b * 'c * 'd) QCheck2.Gen.t
      val tup5 :
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t ->
        'c QCheck2.Gen.t ->
        'd QCheck2.Gen.t ->
        'e QCheck2.Gen.t -> ('a * 'b * 'c * 'd * 'e) QCheck2.Gen.t
      val tup6 :
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t ->
        'c QCheck2.Gen.t ->
        'd QCheck2.Gen.t ->
        'e QCheck2.Gen.t ->
        'f QCheck2.Gen.t -> ('a * 'b * 'c * 'd * 'e * 'f) QCheck2.Gen.t
      val tup7 :
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t ->
        'c QCheck2.Gen.t ->
        'd QCheck2.Gen.t ->
        'e QCheck2.Gen.t ->
        'f QCheck2.Gen.t ->
        'g QCheck2.Gen.t -> ('a * 'b * 'c * 'd * 'e * 'f * 'g) QCheck2.Gen.t
      val tup8 :
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t ->
        'c QCheck2.Gen.t ->
        'd QCheck2.Gen.t ->
        'e QCheck2.Gen.t ->
        'f QCheck2.Gen.t ->
        'g QCheck2.Gen.t ->
        'h QCheck2.Gen.t ->
        ('a * 'b * 'c * 'd * 'e * 'f * 'g * 'h) QCheck2.Gen.t
      val tup9 :
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t ->
        'c QCheck2.Gen.t ->
        'd QCheck2.Gen.t ->
        'e QCheck2.Gen.t ->
        'f QCheck2.Gen.t ->
        'g QCheck2.Gen.t ->
        'h QCheck2.Gen.t ->
        'i QCheck2.Gen.t ->
        ('a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i) QCheck2.Gen.t
      val flatten_l : 'a QCheck2.Gen.t list -> 'a list QCheck2.Gen.t
      val flatten_a : 'a QCheck2.Gen.t array -> 'a array QCheck2.Gen.t
      val flatten_opt : 'a QCheck2.Gen.t option -> 'a option QCheck2.Gen.t
      val flatten_res :
        ('a QCheck2.Gen.t, 'e) Stdlib.result ->
        ('a, 'e) Stdlib.result QCheck2.Gen.t
      val join : 'a QCheck2.Gen.t QCheck2.Gen.t -> 'a QCheck2.Gen.t
      val sized : 'a QCheck2.Gen.sized -> 'a QCheck2.Gen.t
      val sized_size :
        int QCheck2.Gen.t -> 'a QCheck2.Gen.sized -> 'a QCheck2.Gen.t
      val fix :
        (('a -> 'b QCheck2.Gen.t) -> 'a -> 'b QCheck2.Gen.t) ->
        'a -> 'b QCheck2.Gen.t
      val delay : (unit -> 'a QCheck2.Gen.t) -> 'a QCheck2.Gen.t
      val map : ('a -> 'b) -> 'a QCheck2.Gen.t -> 'b QCheck2.Gen.t
      val ( >|= ) : 'a QCheck2.Gen.t -> ('a -> 'b) -> 'b QCheck2.Gen.t
      val ( <$> ) : ('a -> 'b) -> 'a QCheck2.Gen.t -> 'b QCheck2.Gen.t
      val map2 :
        ('a -> 'b -> 'c) ->
        'a QCheck2.Gen.t -> 'b QCheck2.Gen.t -> 'c QCheck2.Gen.t
      val map3 :
        ('a -> 'b -> 'c -> 'd) ->
        'a QCheck2.Gen.t ->
        'b QCheck2.Gen.t -> 'c QCheck2.Gen.t -> 'd QCheck2.Gen.t
      val ap :
        ('a -> 'b) QCheck2.Gen.t -> 'a QCheck2.Gen.t -> 'b QCheck2.Gen.t
      val ( <*> ) :
        ('a -> 'b) QCheck2.Gen.t -> 'a QCheck2.Gen.t -> 'b QCheck2.Gen.t
      val bind :
        'a QCheck2.Gen.t -> ('a -> 'b QCheck2.Gen.t) -> 'b QCheck2.Gen.t
      val ( >>= ) :
        'a QCheck2.Gen.t -> ('a -> 'b QCheck2.Gen.t) -> 'b QCheck2.Gen.t
      val ( let+ ) : 'a QCheck2.Gen.t -> ('a -> 'b) -> 'b QCheck2.Gen.t
      val ( and+ ) :
        'a QCheck2.Gen.t -> 'b QCheck2.Gen.t -> ('a * 'b) QCheck2.Gen.t
      val ( let* ) :
        'a QCheck2.Gen.t -> ('a -> 'b QCheck2.Gen.t) -> 'b QCheck2.Gen.t
      val ( and* ) :
        'a QCheck2.Gen.t -> 'b QCheck2.Gen.t -> ('a * 'b) QCheck2.Gen.t
      val generate :
        ?rand:Stdlib.Random.State.t -> n:int -> 'a QCheck2.Gen.t -> 'a list
      val generate1 : ?rand:Stdlib.Random.State.t -> 'a QCheck2.Gen.t -> 'a
      val generate_tree :
        ?rand:Stdlib.Random.State.t -> 'a QCheck2.Gen.t -> 'a QCheck2.Tree.t
    end
  module Print :
    sig
      type 'a t = 'a -> string
      val unit : unit QCheck2.Print.t
      val int : int QCheck2.Print.t
      val bool : bool QCheck2.Print.t
      val float : float QCheck2.Print.t
      val char : char QCheck2.Print.t
      val bytes : bytes QCheck2.Print.t
      val string : string QCheck2.Print.t
      val option : 'a QCheck2.Print.t -> 'a option QCheck2.Print.t
      val pair :
        'a QCheck2.Print.t -> 'b QCheck2.Print.t -> ('a * 'b) QCheck2.Print.t
      val triple :
        'a QCheck2.Print.t ->
        'b QCheck2.Print.t ->
        'c QCheck2.Print.t -> ('a * 'b * 'c) QCheck2.Print.t
      val quad :
        'a QCheck2.Print.t ->
        'b QCheck2.Print.t ->
        'c QCheck2.Print.t ->
        'd QCheck2.Print.t -> ('a * 'b * 'c * 'd) QCheck2.Print.t
      val list : 'a QCheck2.Print.t -> 'a list QCheck2.Print.t
      val array : 'a QCheck2.Print.t -> 'a array QCheck2.Print.t
      val contramap : ('b -> 'a) -> 'a QCheck2.Print.t -> 'b QCheck2.Print.t
      val comap : ('b -> 'a) -> 'a QCheck2.Print.t -> 'b QCheck2.Print.t
      val tup2 :
        'a QCheck2.Print.t -> 'b QCheck2.Print.t -> ('a * 'b) QCheck2.Print.t
      val tup3 :
        'a QCheck2.Print.t ->
        'b QCheck2.Print.t ->
        'c QCheck2.Print.t -> ('a * 'b * 'c) QCheck2.Print.t
      val tup4 :
        'a QCheck2.Print.t ->
        'b QCheck2.Print.t ->
        'c QCheck2.Print.t ->
        'd QCheck2.Print.t -> ('a * 'b * 'c * 'd) QCheck2.Print.t
      val tup5 :
        'a QCheck2.Print.t ->
        'b QCheck2.Print.t ->
        'c QCheck2.Print.t ->
        'd QCheck2.Print.t ->
        'e QCheck2.Print.t -> ('a * 'b * 'c * 'd * 'e) QCheck2.Print.t
      val tup6 :
        'a QCheck2.Print.t ->
        'b QCheck2.Print.t ->
        'c QCheck2.Print.t ->
        'd QCheck2.Print.t ->
        'e QCheck2.Print.t ->
        'f QCheck2.Print.t -> ('a * 'b * 'c * 'd * 'e * 'f) QCheck2.Print.t
      val tup7 :
        'a QCheck2.Print.t ->
        'b QCheck2.Print.t ->
        'c QCheck2.Print.t ->
        'd QCheck2.Print.t ->
        'e QCheck2.Print.t ->
        'f QCheck2.Print.t ->
        'g QCheck2.Print.t ->
        ('a * 'b * 'c * 'd * 'e * 'f * 'g) QCheck2.Print.t
      val tup8 :
        'a QCheck2.Print.t ->
        'b QCheck2.Print.t ->
        'c QCheck2.Print.t ->
        'd QCheck2.Print.t ->
        'e QCheck2.Print.t ->
        'f QCheck2.Print.t ->
        'g QCheck2.Print.t ->
        'h QCheck2.Print.t ->
        ('a * 'b * 'c * 'd * 'e * 'f * 'g * 'h) QCheck2.Print.t
      val tup9 :
        'a QCheck2.Print.t ->
        'b QCheck2.Print.t ->
        'c QCheck2.Print.t ->
        'd QCheck2.Print.t ->
        'e QCheck2.Print.t ->
        'f QCheck2.Print.t ->
        'g QCheck2.Print.t ->
        'h QCheck2.Print.t ->
        'i QCheck2.Print.t ->
        ('a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i) QCheck2.Print.t
    end
  module Shrink :
    sig
      module type Number =
        sig
          type t
          val equal :
            QCheck2.Shrink.Number.t -> QCheck2.Shrink.Number.t -> bool
          val div :
            QCheck2.Shrink.Number.t ->
            QCheck2.Shrink.Number.t -> QCheck2.Shrink.Number.t
          val add :
            QCheck2.Shrink.Number.t ->
            QCheck2.Shrink.Number.t -> QCheck2.Shrink.Number.t
          val sub :
            QCheck2.Shrink.Number.t ->
            QCheck2.Shrink.Number.t -> QCheck2.Shrink.Number.t
          val of_int : int -> QCheck2.Shrink.Number.t
        end
      val number_towards :
        (module QCheck2.Shrink.Number with type t = 'a) ->
        destination:'a -> 'a -> 'a Stdlib.Seq.t
      val int_towards : int -> int -> int Stdlib.Seq.t
      val int32_towards : int32 -> int32 -> int32 Stdlib.Seq.t
      val int64_towards : int64 -> int64 -> int64 Stdlib.Seq.t
      val float_towards : float -> float -> float Stdlib.Seq.t
      val int_aggressive_towards : int -> int -> int Stdlib.Seq.t
      val int_aggressive : int -> int Stdlib.Seq.t
    end
  module Observable :
    sig
      type -'a t
      val make :
        ?eq:('a -> 'a -> bool) ->
        ?hash:('a -> int) -> 'a QCheck2.Print.t -> 'a QCheck2.Observable.t
      val equal : 'a QCheck2.Observable.t -> 'a -> 'a -> bool
      val hash : 'a QCheck2.Observable.t -> 'a -> int
      val print : 'a QCheck2.Observable.t -> 'a QCheck2.Print.t
      val unit : unit QCheck2.Observable.t
      val bool : bool QCheck2.Observable.t
      val int : int QCheck2.Observable.t
      val float : float QCheck2.Observable.t
      val bytes : bytes QCheck2.Observable.t
      val string : string QCheck2.Observable.t
      val char : char QCheck2.Observable.t
      val contramap :
        ('b -> 'a) -> 'a QCheck2.Observable.t -> 'b QCheck2.Observable.t
      val map :
        ('b -> 'a) -> 'a QCheck2.Observable.t -> 'b QCheck2.Observable.t
      val option : 'a QCheck2.Observable.t -> 'a option QCheck2.Observable.t
      val list : 'a QCheck2.Observable.t -> 'a list QCheck2.Observable.t
      val array : 'a QCheck2.Observable.t -> 'a array QCheck2.Observable.t
      val pair :
        'a QCheck2.Observable.t ->
        'b QCheck2.Observable.t -> ('a * 'b) QCheck2.Observable.t
      val triple :
        'a QCheck2.Observable.t ->
        'b QCheck2.Observable.t ->
        'c QCheck2.Observable.t -> ('a * 'b * 'c) QCheck2.Observable.t
      val quad :
        'a QCheck2.Observable.t ->
        'b QCheck2.Observable.t ->
        'c QCheck2.Observable.t ->
        'd QCheck2.Observable.t -> ('a * 'b * 'c * 'd) QCheck2.Observable.t
    end
  module Tuple :
    sig
      type 'a t =
          Nil : unit QCheck2.Tuple.t
        | Cons : 'a * 'b QCheck2.Tuple.t -> ('a * 'b) QCheck2.Tuple.t
      val nil : unit QCheck2.Tuple.t
      val cons : 'a -> 'b QCheck2.Tuple.t -> ('a * 'b) QCheck2.Tuple.t
      type 'a obs
      val o_nil : unit QCheck2.Tuple.obs
      val o_cons :
        'a QCheck2.Observable.t ->
        'b QCheck2.Tuple.obs -> ('a * 'b) QCheck2.Tuple.obs
      val observable :
        'a QCheck2.Tuple.obs -> 'a QCheck2.Tuple.t QCheck2.Observable.t
      module Infix :
        sig
          val ( @:: ) : 'a -> 'b QCheck2.Tuple.t -> ('a * 'b) QCheck2.Tuple.t
          val ( @-> ) :
            'a QCheck2.Observable.t ->
            'b QCheck2.Tuple.obs -> ('a * 'b) QCheck2.Tuple.obs
        end
      val ( @:: ) : 'a -> 'b t -> ('a * 'b) t
      val ( @-> ) : 'a Observable.t -> 'b obs -> ('a * 'b) obs
    end
  type 'f fun_repr
  type 'f fun_ = Fun of 'f QCheck2.fun_repr * 'f
  val fun1 :
    'a QCheck2.Observable.t ->
    ?print:'b QCheck2.Print.t ->
    'b QCheck2.Gen.t -> ('a -> 'b) QCheck2.fun_ QCheck2.Gen.t
  val fun2 :
    'a QCheck2.Observable.t ->
    'b QCheck2.Observable.t ->
    ?print:'c QCheck2.Print.t ->
    'c QCheck2.Gen.t -> ('a -> 'b -> 'c) QCheck2.fun_ QCheck2.Gen.t
  val fun3 :
    'a QCheck2.Observable.t ->
    'b QCheck2.Observable.t ->
    'c QCheck2.Observable.t ->
    ?print:'d QCheck2.Print.t ->
    'd QCheck2.Gen.t -> ('a -> 'b -> 'c -> 'd) QCheck2.fun_ QCheck2.Gen.t
  val fun4 :
    'a QCheck2.Observable.t ->
    'b QCheck2.Observable.t ->
    'c QCheck2.Observable.t ->
    'd QCheck2.Observable.t ->
    ?print:'e QCheck2.Print.t ->
    'e QCheck2.Gen.t ->
    ('a -> 'b -> 'c -> 'd -> 'e) QCheck2.fun_ QCheck2.Gen.t
  val fun_nary :
    'a QCheck2.Tuple.obs ->
    ?print:'b QCheck2.Print.t ->
    'b QCheck2.Gen.t -> ('a QCheck2.Tuple.t -> 'b) QCheck2.fun_ QCheck2.Gen.t
  module Fn :
    sig
      val print : 'f QCheck2.fun_ QCheck2.Print.t
      val apply : 'f QCheck2.fun_ -> 'f
    end
  val assume : bool -> unit
  val ( ==> ) : bool -> bool -> bool
  val assume_fail : unit -> 'a
  type 'a stat = string * ('a -> int)
  module TestResult :
    sig
      type 'a counter_ex = {
        instance : 'a;
        shrink_steps : int;
        msg_l : string list;
      }
      type 'a state =
          Success
        | Failed of { instances : 'a QCheck2.TestResult.counter_ex list; }
        | Failed_other of { msg : string; }
        | Error of { instance : 'a QCheck2.TestResult.counter_ex; exn : exn;
            backtrace : string;
          }
      type 'a t
      val get_state : 'a QCheck2.TestResult.t -> 'a QCheck2.TestResult.state
      val get_count : 'a QCheck2.TestResult.t -> int
      val get_count_gen : 'a QCheck2.TestResult.t -> int
      val get_collect :
        'a QCheck2.TestResult.t -> (string, int) Stdlib.Hashtbl.t option
      val get_stats :
        'a QCheck2.TestResult.t ->
        ('a QCheck2.stat * (int, int) Stdlib.Hashtbl.t) list
      val get_warnings : 'a QCheck2.TestResult.t -> string list
      val get_instances : 'a QCheck2.TestResult.t -> 'a list
      val is_success : 'a QCheck2.TestResult.t -> bool
      val is_failed : 'a QCheck2.TestResult.t -> bool
      val stats :
        'a QCheck2.TestResult.t ->
        ('a QCheck2.stat * (int, int) Stdlib.Hashtbl.t) list
      val warnings : 'a QCheck2.TestResult.t -> string list
      val collect :
        'a QCheck2.TestResult.t -> (string, int) Stdlib.Hashtbl.t option
    end
  module Test_exceptions :
    sig
      exception Test_fail of string * string list
      exception Test_error of string * string * exn * string
    end
  module Test :
    sig
      type 'a cell
      val make_cell :
        ?if_assumptions_fail:[ `Fatal | `Warning ] * float ->
        ?count:int ->
        ?long_factor:int ->
        ?negative:bool ->
        ?max_gen:int ->
        ?max_fail:int ->
        ?retries:int ->
        ?name:string ->
        ?print:'a QCheck2.Print.t ->
        ?collect:('a -> string) ->
        ?stats:'a QCheck2.stat list ->
        'a QCheck2.Gen.t -> ('a -> bool) -> 'a QCheck2.Test.cell
      val make_cell_from_QCheck1 :
        ?if_assumptions_fail:[ `Fatal | `Warning ] * float ->
        ?count:int ->
        ?long_factor:int ->
        ?negative:bool ->
        ?max_gen:int ->
        ?max_fail:int ->
        ?retries:int ->
        ?name:string ->
        gen:(Stdlib.Random.State.t -> 'a) ->
        ?shrink:('a -> ('a -> unit) -> unit) ->
        ?print:('a -> string) ->
        ?collect:('a -> string) ->
        stats:'a QCheck2.stat list -> ('a -> bool) -> 'a QCheck2.Test.cell
      val get_law : 'a QCheck2.Test.cell -> 'a -> bool
      val get_name : 'a QCheck2.Test.cell -> string
      val get_gen : 'a QCheck2.Test.cell -> 'a QCheck2.Gen.t
      val get_print_opt : 'a QCheck2.Test.cell -> 'a QCheck2.Print.t option
      val get_collect_opt : 'a QCheck2.Test.cell -> ('a -> string) option
      val get_stats : 'a QCheck2.Test.cell -> 'a QCheck2.stat list
      val set_name : 'a QCheck2.Test.cell -> string -> unit
      val get_count : 'a QCheck2.Test.cell -> int
      val get_long_factor : 'a QCheck2.Test.cell -> int
      val get_positive : 'a QCheck2.Test.cell -> bool
      type t = Test : 'a QCheck2.Test.cell -> QCheck2.Test.t
      val make :
        ?if_assumptions_fail:[ `Fatal | `Warning ] * float ->
        ?count:int ->
        ?long_factor:int ->
        ?max_gen:int ->
        ?max_fail:int ->
        ?retries:int ->
        ?name:string ->
        ?print:'a QCheck2.Print.t ->
        ?collect:('a -> string) ->
        ?stats:'a QCheck2.stat list ->
        'a QCheck2.Gen.t -> ('a -> bool) -> QCheck2.Test.t
      val make_neg :
        ?if_assumptions_fail:[ `Fatal | `Warning ] * float ->
        ?count:int ->
        ?long_factor:int ->
        ?max_gen:int ->
        ?max_fail:int ->
        ?retries:int ->
        ?name:string ->
        ?print:'a QCheck2.Print.t ->
        ?collect:('a -> string) ->
        ?stats:'a QCheck2.stat list ->
        'a QCheck2.Gen.t -> ('a -> bool) -> QCheck2.Test.t
      val test_get_count : QCheck2.Test.t -> int
      val test_get_long_factor : QCheck2.Test.t -> int
      val fail_report : string -> 'a
      val fail_reportf :
        ('a, Stdlib.Format.formatter, unit, 'b) Stdlib.format4 -> 'a
      exception Test_fail of string * string list
      exception Test_error of string * string * exn * string
      val print_instance : 'a QCheck2.Test.cell -> 'a -> string
      val print_c_ex :
        'a QCheck2.Test.cell -> 'a QCheck2.TestResult.counter_ex -> string
      val print_fail :
        'a QCheck2.Test.cell ->
        string -> 'a QCheck2.TestResult.counter_ex list -> string
      val print_fail_other : string -> msg:string -> string
      val print_expected_failure :
        'a QCheck2.Test.cell ->
        'a QCheck2.TestResult.counter_ex list -> string
      val print_error :
        ?st:string ->
        'a QCheck2.Test.cell ->
        string -> 'a QCheck2.TestResult.counter_ex * exn -> string
      val print_test_fail : string -> string list -> string
      val print_test_error : string -> string -> exn -> string -> string
      val print_collect : (string, int) Stdlib.Hashtbl.t -> string
      val print_stat :
        'a QCheck2.stat * (int, int) Stdlib.Hashtbl.t -> string
      val check_result :
        'a QCheck2.Test.cell -> 'a QCheck2.TestResult.t -> unit
      type res = Success | Failure | FalseAssumption | Error of exn * string
      type 'a event =
          Generating
        | Collecting of 'a
        | Testing of 'a
        | Shrunk of int * 'a
        | Shrinking of int * int * 'a
      type 'a handler =
          string -> 'a QCheck2.Test.cell -> 'a QCheck2.Test.event -> unit
      type 'a step =
          string -> 'a QCheck2.Test.cell -> 'a -> QCheck2.Test.res -> unit
      type 'a callback =
          string -> 'a QCheck2.Test.cell -> 'a QCheck2.TestResult.t -> unit
      val check_cell :
        ?long:bool ->
        ?call:'a QCheck2.Test.callback ->
        ?step:'a QCheck2.Test.step ->
        ?handler:'a QCheck2.Test.handler ->
        ?rand:Stdlib.Random.State.t ->
        'a QCheck2.Test.cell -> 'a QCheck2.TestResult.t
      val check_cell_exn :
        ?long:bool ->
        ?call:'a QCheck2.Test.callback ->
        ?step:'a QCheck2.Test.step ->
        ?handler:'a QCheck2.Test.handler ->
        ?rand:Stdlib.Random.State.t -> 'a QCheck2.Test.cell -> unit
      val check_exn :
        ?long:bool -> ?rand:Stdlib.Random.State.t -> QCheck2.Test.t -> unit
    end
  exception No_example_found of string
  val find_example :
    ?name:string ->
    ?count:int -> f:('a -> bool) -> 'a QCheck2.Gen.t -> 'a QCheck2.Gen.t
  val find_example_gen :
    ?rand:Stdlib.Random.State.t ->
    ?name:string -> ?count:int -> f:('a -> bool) -> 'a QCheck2.Gen.t -> 'a
end