sig
  module type Set_ =
    sig
      type 'a elt_
      type 'a set
      type ('a, 'b) result_
      val empty : 'Reins.Sets.Set_.set
      val is_empty : 'Reins.Sets.Set_.set -> bool
      val mem :
        'Reins.Sets.Set_.elt_ ->
        'Reins.Sets.Set_.set -> (bool, 'a) Reins.Sets.Set_.result_
      val add :
        'Reins.Sets.Set_.elt_ ->
        'Reins.Sets.Set_.set -> 'Reins.Sets.Set_.set
      val singleton : 'Reins.Sets.Set_.elt_ -> 'Reins.Sets.Set_.set
      val remove :
        'Reins.Sets.Set_.elt_ ->
        'Reins.Sets.Set_.set -> 'Reins.Sets.Set_.set
      val min_elt :
        'Reins.Sets.Set_.set ->
        ('Reins.Sets.Set_.elt_, 'a) Reins.Sets.Set_.result_
      val max_elt :
        'Reins.Sets.Set_.set ->
        ('Reins.Sets.Set_.elt_, 'a) Reins.Sets.Set_.result_
      val choose :
        'Reins.Sets.Set_.set ->
        ('Reins.Sets.Set_.elt_, 'a) Reins.Sets.Set_.result_
      val cardinal : 'Reins.Sets.Set_.set -> int
      val compare : 'Reins.Sets.Set_.set -> 'Reins.Sets.Set_.set -> int
      val equal : 'Reins.Sets.Set_.set -> 'Reins.Sets.Set_.set -> bool
      val iter :
        ('Reins.Sets.Set_.elt_ -> unit) -> 'Reins.Sets.Set_.set -> unit
      val fold :
        ('-> 'Reins.Sets.Set_.elt_ -> 'a) ->
        '-> 'Reins.Sets.Set_.set -> 'a
      val union :
        'Reins.Sets.Set_.set ->
        'Reins.Sets.Set_.set -> 'Reins.Sets.Set_.set
      val inter :
        'Reins.Sets.Set_.set ->
        'Reins.Sets.Set_.set -> 'Reins.Sets.Set_.set
      val diff :
        'Reins.Sets.Set_.set ->
        'Reins.Sets.Set_.set -> 'Reins.Sets.Set_.set
      val gen1 :
        (?size:int -> Random.State.t -> 'Reins.Sets.Set_.elt_) ->
        ?size:int -> Random.State.t -> 'Reins.Sets.Set_.set
      val well_formed : 'Reins.Sets.Set_.set -> bool
      val of_result : ('a, 'b) Reins.Sets.Set_.result_ -> 'a
      type 'a cursor_
      val to_cursor : 'Reins.Sets.Set_.set -> 'Reins.Sets.Set_.cursor_
      val from_cursor : 'Reins.Sets.Set_.cursor_ -> 'Reins.Sets.Set_.set
      val at_top : 'Reins.Sets.Set_.cursor_ -> bool
      val at_left : 'Reins.Sets.Set_.cursor_ -> bool
      val at_right : 'Reins.Sets.Set_.cursor_ -> bool
      val move_up : 'Reins.Sets.Set_.cursor_ -> 'Reins.Sets.Set_.cursor_
      val move_down_left :
        'Reins.Sets.Set_.cursor_ -> 'Reins.Sets.Set_.cursor_
      val move_down_right :
        'Reins.Sets.Set_.cursor_ -> 'Reins.Sets.Set_.cursor_
      val went_left : 'Reins.Sets.Set_.cursor_ -> bool
      val went_right : 'Reins.Sets.Set_.cursor_ -> bool
      val has_value : 'Reins.Sets.Set_.cursor_ -> bool
      val get_value : 'Reins.Sets.Set_.cursor_ -> 'Reins.Sets.Set_.elt_
    end
  module type MonoSetSig =
    sig
      type t
      type elt
      type cursor
      type 'a result
      type 'a elt_ = elt
      type 'a set = t
      type ('a, 'b) result_ = 'a result
      val empty : 'a set
      val is_empty : 'a set -> bool
      val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
      val add : 'a elt_ -> 'a set -> 'a set
      val singleton : 'a elt_ -> 'a set
      val remove : 'a elt_ -> 'a set -> 'a set
      val min_elt : 'a set -> ('a elt_, 'a) result_
      val max_elt : 'a set -> ('a elt_, 'a) result_
      val choose : 'a set -> ('a elt_, 'a) result_
      val cardinal : 'a set -> int
      val compare : 'a set -> 'a set -> int
      val equal : 'a set -> 'a set -> bool
      val iter : ('a elt_ -> unit) -> 'a set -> unit
      val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
      val union : 'a set -> 'a set -> 'a set
      val inter : 'a set -> 'a set -> 'a set
      val diff : 'a set -> 'a set -> 'a set
      val gen1 :
        (?size:int -> Random.State.t -> 'a elt_) ->
        ?size:int -> Random.State.t -> 'a set
      val well_formed : 'a set -> bool
      val of_result : ('a, 'b) result_ -> 'a
      type 'a cursor_ = cursor
      val to_cursor : 'a set -> 'a cursor_
      val from_cursor : 'a cursor_ -> 'a set
      val at_top : 'a cursor_ -> bool
      val at_left : 'a cursor_ -> bool
      val at_right : 'a cursor_ -> bool
      val move_up : 'a cursor_ -> 'a cursor_
      val move_down_left : 'a cursor_ -> 'a cursor_
      val move_down_right : 'a cursor_ -> 'a cursor_
      val went_left : 'a cursor_ -> bool
      val went_right : 'a cursor_ -> bool
      val has_value : 'a cursor_ -> bool
      val get_value : 'a cursor_ -> 'a elt_
      val to_string : 'a set -> string
    end
  module type MonoSetSigFn =
    functor (C : Types.Mono.Comparable->
      sig
        type t
        type elt = C.t
        type cursor
        type 'a result
        type 'a elt_ = elt
        type 'a set = t
        type ('a, 'b) result_ = 'a result
        val empty : 'a set
        val is_empty : 'a set -> bool
        val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
        val add : 'a elt_ -> 'a set -> 'a set
        val singleton : 'a elt_ -> 'a set
        val remove : 'a elt_ -> 'a set -> 'a set
        val min_elt : 'a set -> ('a elt_, 'a) result_
        val max_elt : 'a set -> ('a elt_, 'a) result_
        val choose : 'a set -> ('a elt_, 'a) result_
        val cardinal : 'a set -> int
        val compare : 'a set -> 'a set -> int
        val equal : 'a set -> 'a set -> bool
        val iter : ('a elt_ -> unit) -> 'a set -> unit
        val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
        val union : 'a set -> 'a set -> 'a set
        val inter : 'a set -> 'a set -> 'a set
        val diff : 'a set -> 'a set -> 'a set
        val gen1 :
          (?size:int -> Random.State.t -> 'a elt_) ->
          ?size:int -> Random.State.t -> 'a set
        val well_formed : 'a set -> bool
        val of_result : ('a, 'b) result_ -> 'a
        type 'a cursor_ = cursor
        val to_cursor : 'a set -> 'a cursor_
        val from_cursor : 'a cursor_ -> 'a set
        val at_top : 'a cursor_ -> bool
        val at_left : 'a cursor_ -> bool
        val at_right : 'a cursor_ -> bool
        val move_up : 'a cursor_ -> 'a cursor_
        val move_down_left : 'a cursor_ -> 'a cursor_
        val move_down_right : 'a cursor_ -> 'a cursor_
        val went_left : 'a cursor_ -> bool
        val went_right : 'a cursor_ -> bool
        val has_value : 'a cursor_ -> bool
        val get_value : 'a cursor_ -> 'a elt_
        val to_string : 'a set -> string
      end
  module type MonoSetSigFnStd =
    functor (C : Types.Mono.Comparable->
      sig
        type t
        type elt = C.t
        type cursor
        type 'a result = 'a
        type 'a elt_ = elt
        type 'a set = t
        type ('a, 'b) result_ = 'a result
        val empty : 'a set
        val is_empty : 'a set -> bool
        val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
        val add : 'a elt_ -> 'a set -> 'a set
        val singleton : 'a elt_ -> 'a set
        val remove : 'a elt_ -> 'a set -> 'a set
        val min_elt : 'a set -> ('a elt_, 'a) result_
        val max_elt : 'a set -> ('a elt_, 'a) result_
        val choose : 'a set -> ('a elt_, 'a) result_
        val cardinal : 'a set -> int
        val compare : 'a set -> 'a set -> int
        val equal : 'a set -> 'a set -> bool
        val iter : ('a elt_ -> unit) -> 'a set -> unit
        val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
        val union : 'a set -> 'a set -> 'a set
        val inter : 'a set -> 'a set -> 'a set
        val diff : 'a set -> 'a set -> 'a set
        val gen1 :
          (?size:int -> Random.State.t -> 'a elt_) ->
          ?size:int -> Random.State.t -> 'a set
        val well_formed : 'a set -> bool
        val of_result : ('a, 'b) result_ -> 'a
        type 'a cursor_ = cursor
        val to_cursor : 'a set -> 'a cursor_
        val from_cursor : 'a cursor_ -> 'a set
        val at_top : 'a cursor_ -> bool
        val at_left : 'a cursor_ -> bool
        val at_right : 'a cursor_ -> bool
        val move_up : 'a cursor_ -> 'a cursor_
        val move_down_left : 'a cursor_ -> 'a cursor_
        val move_down_right : 'a cursor_ -> 'a cursor_
        val went_left : 'a cursor_ -> bool
        val went_right : 'a cursor_ -> bool
        val has_value : 'a cursor_ -> bool
        val get_value : 'a cursor_ -> 'a elt_
        val to_string : 'a set -> string
      end
  module type GenSetSig =
    sig
      type t
      type elt
      type cursor
      type 'a result
      type 'a elt_ = elt
      type 'a set = t
      type ('a, 'b) result_ = 'a result
      val empty : 'a set
      val is_empty : 'a set -> bool
      val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
      val add : 'a elt_ -> 'a set -> 'a set
      val singleton : 'a elt_ -> 'a set
      val remove : 'a elt_ -> 'a set -> 'a set
      val min_elt : 'a set -> ('a elt_, 'a) result_
      val max_elt : 'a set -> ('a elt_, 'a) result_
      val choose : 'a set -> ('a elt_, 'a) result_
      val cardinal : 'a set -> int
      val compare : 'a set -> 'a set -> int
      val equal : 'a set -> 'a set -> bool
      val iter : ('a elt_ -> unit) -> 'a set -> unit
      val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
      val union : 'a set -> 'a set -> 'a set
      val inter : 'a set -> 'a set -> 'a set
      val diff : 'a set -> 'a set -> 'a set
      val gen1 :
        (?size:int -> Random.State.t -> 'a elt_) ->
        ?size:int -> Random.State.t -> 'a set
      val well_formed : 'a set -> bool
      val of_result : ('a, 'b) result_ -> 'a
      type 'a cursor_ = cursor
      val to_cursor : 'a set -> 'a cursor_
      val from_cursor : 'a cursor_ -> 'a set
      val at_top : 'a cursor_ -> bool
      val at_left : 'a cursor_ -> bool
      val at_right : 'a cursor_ -> bool
      val move_up : 'a cursor_ -> 'a cursor_
      val move_down_left : 'a cursor_ -> 'a cursor_
      val move_down_right : 'a cursor_ -> 'a cursor_
      val went_left : 'a cursor_ -> bool
      val went_right : 'a cursor_ -> bool
      val has_value : 'a cursor_ -> bool
      val get_value : 'a cursor_ -> 'a elt_
      val to_string : 'a set -> string
      val gen : ?size:int -> Random.State.t -> t
    end
  module type GenSetSigFn =
    functor (C : Types.Mono.ArbitraryComparable->
      sig
        type t
        type elt = C.t
        type cursor
        type 'a result
        type 'a elt_ = elt
        type 'a set = t
        type ('a, 'b) result_ = 'a result
        val empty : 'a set
        val is_empty : 'a set -> bool
        val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
        val add : 'a elt_ -> 'a set -> 'a set
        val singleton : 'a elt_ -> 'a set
        val remove : 'a elt_ -> 'a set -> 'a set
        val min_elt : 'a set -> ('a elt_, 'a) result_
        val max_elt : 'a set -> ('a elt_, 'a) result_
        val choose : 'a set -> ('a elt_, 'a) result_
        val cardinal : 'a set -> int
        val compare : 'a set -> 'a set -> int
        val equal : 'a set -> 'a set -> bool
        val iter : ('a elt_ -> unit) -> 'a set -> unit
        val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
        val union : 'a set -> 'a set -> 'a set
        val inter : 'a set -> 'a set -> 'a set
        val diff : 'a set -> 'a set -> 'a set
        val gen1 :
          (?size:int -> Random.State.t -> 'a elt_) ->
          ?size:int -> Random.State.t -> 'a set
        val well_formed : 'a set -> bool
        val of_result : ('a, 'b) result_ -> 'a
        type 'a cursor_ = cursor
        val to_cursor : 'a set -> 'a cursor_
        val from_cursor : 'a cursor_ -> 'a set
        val at_top : 'a cursor_ -> bool
        val at_left : 'a cursor_ -> bool
        val at_right : 'a cursor_ -> bool
        val move_up : 'a cursor_ -> 'a cursor_
        val move_down_left : 'a cursor_ -> 'a cursor_
        val move_down_right : 'a cursor_ -> 'a cursor_
        val went_left : 'a cursor_ -> bool
        val went_right : 'a cursor_ -> bool
        val has_value : 'a cursor_ -> bool
        val get_value : 'a cursor_ -> 'a elt_
        val to_string : 'a set -> string
        val gen : ?size:int -> Random.State.t -> t
      end
  module type GenSetSigFnStd =
    functor (C : Types.Mono.ArbitraryComparable->
      sig
        type t
        type elt = C.t
        type cursor
        type 'a result = 'a
        type 'a elt_ = elt
        type 'a set = t
        type ('a, 'b) result_ = 'a result
        val empty : 'a set
        val is_empty : 'a set -> bool
        val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
        val add : 'a elt_ -> 'a set -> 'a set
        val singleton : 'a elt_ -> 'a set
        val remove : 'a elt_ -> 'a set -> 'a set
        val min_elt : 'a set -> ('a elt_, 'a) result_
        val max_elt : 'a set -> ('a elt_, 'a) result_
        val choose : 'a set -> ('a elt_, 'a) result_
        val cardinal : 'a set -> int
        val compare : 'a set -> 'a set -> int
        val equal : 'a set -> 'a set -> bool
        val iter : ('a elt_ -> unit) -> 'a set -> unit
        val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
        val union : 'a set -> 'a set -> 'a set
        val inter : 'a set -> 'a set -> 'a set
        val diff : 'a set -> 'a set -> 'a set
        val gen1 :
          (?size:int -> Random.State.t -> 'a elt_) ->
          ?size:int -> Random.State.t -> 'a set
        val well_formed : 'a set -> bool
        val of_result : ('a, 'b) result_ -> 'a
        type 'a cursor_ = cursor
        val to_cursor : 'a set -> 'a cursor_
        val from_cursor : 'a cursor_ -> 'a set
        val at_top : 'a cursor_ -> bool
        val at_left : 'a cursor_ -> bool
        val at_right : 'a cursor_ -> bool
        val move_up : 'a cursor_ -> 'a cursor_
        val move_down_left : 'a cursor_ -> 'a cursor_
        val move_down_right : 'a cursor_ -> 'a cursor_
        val went_left : 'a cursor_ -> bool
        val went_right : 'a cursor_ -> bool
        val has_value : 'a cursor_ -> bool
        val get_value : 'a cursor_ -> 'a elt_
        val to_string : 'a set -> string
        val gen : ?size:int -> Random.State.t -> t
      end
  module type PolySetSig =
    sig
      type 'a t
      type 'a cursor
      type ('a, 'b) result
      type 'a elt_ = 'a
      type 'a set = 'a t
      type ('a, 'b) result_ = ('a, 'b) result
      val empty : 'a set
      val is_empty : 'a set -> bool
      val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
      val add : 'a elt_ -> 'a set -> 'a set
      val singleton : 'a elt_ -> 'a set
      val remove : 'a elt_ -> 'a set -> 'a set
      val min_elt : 'a set -> ('a elt_, 'a) result_
      val max_elt : 'a set -> ('a elt_, 'a) result_
      val choose : 'a set -> ('a elt_, 'a) result_
      val cardinal : 'a set -> int
      val compare : 'a set -> 'a set -> int
      val equal : 'a set -> 'a set -> bool
      val iter : ('a elt_ -> unit) -> 'a set -> unit
      val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
      val union : 'a set -> 'a set -> 'a set
      val inter : 'a set -> 'a set -> 'a set
      val diff : 'a set -> 'a set -> 'a set
      val gen1 :
        (?size:int -> Random.State.t -> 'a elt_) ->
        ?size:int -> Random.State.t -> 'a set
      val well_formed : 'a set -> bool
      val of_result : ('a, 'b) result_ -> 'a
      type 'a cursor_ = 'a cursor
      val to_cursor : 'a set -> 'a cursor_
      val from_cursor : 'a cursor_ -> 'a set
      val at_top : 'a cursor_ -> bool
      val at_left : 'a cursor_ -> bool
      val at_right : 'a cursor_ -> bool
      val move_up : 'a cursor_ -> 'a cursor_
      val move_down_left : 'a cursor_ -> 'a cursor_
      val move_down_right : 'a cursor_ -> 'a cursor_
      val went_left : 'a cursor_ -> bool
      val went_right : 'a cursor_ -> bool
      val has_value : 'a cursor_ -> bool
      val get_value : 'a cursor_ -> 'a elt_
      val to_string : ('-> string) -> 'a set -> string
    end
  module type PolySetSigStd =
    sig
      type 'a t
      type 'a cursor
      type ('a, 'b) result = 'a
      type 'a elt_ = 'a
      type 'a set = 'a t
      type ('a, 'b) result_ = ('a, 'b) result
      val empty : 'a set
      val is_empty : 'a set -> bool
      val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
      val add : 'a elt_ -> 'a set -> 'a set
      val singleton : 'a elt_ -> 'a set
      val remove : 'a elt_ -> 'a set -> 'a set
      val min_elt : 'a set -> ('a elt_, 'a) result_
      val max_elt : 'a set -> ('a elt_, 'a) result_
      val choose : 'a set -> ('a elt_, 'a) result_
      val cardinal : 'a set -> int
      val compare : 'a set -> 'a set -> int
      val equal : 'a set -> 'a set -> bool
      val iter : ('a elt_ -> unit) -> 'a set -> unit
      val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
      val union : 'a set -> 'a set -> 'a set
      val inter : 'a set -> 'a set -> 'a set
      val diff : 'a set -> 'a set -> 'a set
      val gen1 :
        (?size:int -> Random.State.t -> 'a elt_) ->
        ?size:int -> Random.State.t -> 'a set
      val well_formed : 'a set -> bool
      val of_result : ('a, 'b) result_ -> 'a
      type 'a cursor_ = 'a cursor
      val to_cursor : 'a set -> 'a cursor_
      val from_cursor : 'a cursor_ -> 'a set
      val at_top : 'a cursor_ -> bool
      val at_left : 'a cursor_ -> bool
      val at_right : 'a cursor_ -> bool
      val move_up : 'a cursor_ -> 'a cursor_
      val move_down_left : 'a cursor_ -> 'a cursor_
      val move_down_right : 'a cursor_ -> 'a cursor_
      val went_left : 'a cursor_ -> bool
      val went_right : 'a cursor_ -> bool
      val has_value : 'a cursor_ -> bool
      val get_value : 'a cursor_ -> 'a elt_
      val to_string : ('-> string) -> 'a set -> string
    end
end