sig
  module type Heap_ =
    sig
      type 'a elt_
      type 'a heap
      val empty : 'Reins.Heaps.Heap_.heap
      val is_empty : 'Reins.Heaps.Heap_.heap -> bool
      val singleton : 'Reins.Heaps.Heap_.elt_ -> 'Reins.Heaps.Heap_.heap
      val insert :
        'Reins.Heaps.Heap_.elt_ ->
        'Reins.Heaps.Heap_.heap -> 'Reins.Heaps.Heap_.heap
      val merge :
        'Reins.Heaps.Heap_.heap ->
        'Reins.Heaps.Heap_.heap -> 'Reins.Heaps.Heap_.heap
      val find_min : 'Reins.Heaps.Heap_.heap -> 'Reins.Heaps.Heap_.elt_
      val delete_min : 'Reins.Heaps.Heap_.heap -> 'Reins.Heaps.Heap_.heap
    end
  module type MonoHeapSig =
    sig
      type t
      type elt
      type 'a elt_ = elt
      type 'a heap = t
      val empty : 'a heap
      val is_empty : 'a heap -> bool
      val singleton : 'a elt_ -> 'a heap
      val insert : 'a elt_ -> 'a heap -> 'a heap
      val merge : 'a heap -> 'a heap -> 'a heap
      val find_min : 'a heap -> 'a elt_
      val delete_min : 'a heap -> 'a heap
      val to_string : 'a heap -> string
    end
  module type MonoHeapSigFn =
    functor (C : Types.Mono.Comparable->
      sig
        type t
        type elt = C.t
        type 'a elt_ = elt
        type 'a heap = t
        val empty : 'a heap
        val is_empty : 'a heap -> bool
        val singleton : 'a elt_ -> 'a heap
        val insert : 'a elt_ -> 'a heap -> 'a heap
        val merge : 'a heap -> 'a heap -> 'a heap
        val find_min : 'a heap -> 'a elt_
        val delete_min : 'a heap -> 'a heap
        val to_string : 'a heap -> string
      end
  module type GenHeapSig =
    sig
      type t
      type elt
      type 'a elt_ = elt
      type 'a heap = t
      val empty : 'a heap
      val is_empty : 'a heap -> bool
      val singleton : 'a elt_ -> 'a heap
      val insert : 'a elt_ -> 'a heap -> 'a heap
      val merge : 'a heap -> 'a heap -> 'a heap
      val find_min : 'a heap -> 'a elt_
      val delete_min : 'a heap -> 'a heap
      val to_string : 'a heap -> string
      val gen : ?size:int -> Random.State.t -> t
    end
  module type GenHeapSigFn =
    functor (C : Types.Mono.ArbitraryComparable->
      sig
        type t
        type elt = C.t
        type 'a elt_ = elt
        type 'a heap = t
        val empty : 'a heap
        val is_empty : 'a heap -> bool
        val singleton : 'a elt_ -> 'a heap
        val insert : 'a elt_ -> 'a heap -> 'a heap
        val merge : 'a heap -> 'a heap -> 'a heap
        val find_min : 'a heap -> 'a elt_
        val delete_min : 'a heap -> 'a heap
        val to_string : 'a heap -> string
        val gen : ?size:int -> Random.State.t -> t
      end
  module type PolyHeapSig =
    sig
      type 'a t
      type 'a elt_ = 'a
      type 'a heap = 'a t
      val empty : 'a heap
      val is_empty : 'a heap -> bool
      val singleton : 'a elt_ -> 'a heap
      val insert : 'a elt_ -> 'a heap -> 'a heap
      val merge : 'a heap -> 'a heap -> 'a heap
      val find_min : 'a heap -> 'a elt_
      val delete_min : 'a heap -> 'a heap
      val to_string : ('-> string) -> 'a heap -> string
    end
end