sig
  type ('a, 'witness) t = private {
    compare : '-> '-> int;
    sexp_of_t : '-> Sexplib.Sexp.t;
  }
  type ('a, 'b) comparator = ('a, 'b) Comparator.t
  module type S =
    sig
      type t
      type comparator_witness
      val comparator :
        (Comparator.S.t, Comparator.S.comparator_witness)
        Comparator.comparator
    end
  module type S1 =
    sig
      type 'a t
      type comparator_witness
      val comparator :
        ('Comparator.S1.t, Comparator.S1.comparator_witness)
        Comparator.comparator
    end
  module Poly :
    sig
      type 'a t = 'a
      type comparator_witness
      val comparator : ('a t, comparator_witness) comparator
    end
  module S_to_S1 :
    functor (S : S->
      sig
        type 'a t = S.t
        type comparator_witness = S.comparator_witness
        val comparator : ('a t, comparator_witness) comparator
      end
  module Make :
    functor
      (M : sig
             type t
             val sexp_of_t : Comparator.Make.t -> Sexplib.Sexp.t
             val compare : Comparator.Make.t -> Comparator.Make.t -> int
           end->
      sig
        type comparator_witness
        val comparator : (M.t, comparator_witness) comparator
      end
  module Make1 :
    functor
      (M : sig
             type 'a t
             val compare :
               'Comparator.Make1.t -> 'Comparator.Make1.t -> int
             val sexp_of_t : 'Comparator.Make1.t -> Sexplib.Sexp.t
           end->
      sig
        type comparator_witness
        val comparator : ('M.t, comparator_witness) comparator
      end
end