sig
  module type DATA =
    sig
      type t
      val compare : PrioQueue.DATA.t -> PrioQueue.DATA.t -> int
      val hash : PrioQueue.DATA.t -> int
      val string_of : PrioQueue.DATA.t -> string
    end
  module type S =
    sig
      type t
      type key
      type data
      exception Empty
      val create : unit -> PrioQueue.S.t
      val clear : PrioQueue.S.t -> unit
      val is_empty : PrioQueue.S.t -> bool
      val top : PrioQueue.S.t -> PrioQueue.S.data
      val pop : PrioQueue.S.t -> PrioQueue.S.data
      val push : PrioQueue.S.key -> PrioQueue.S.data -> PrioQueue.S.t -> unit
      val string_of : PrioQueue.S.t -> string
      val remove : PrioQueue.S.data -> PrioQueue.S.t -> unit
    end
  module Make :
    functor (Ord : ProglangUtils.PrioQueues.ORD->
      functor (Data : DATA->
        sig
          type t
          type key = Ord.t
          type data = Data.t
          exception Empty
          val create : unit -> t
          val clear : t -> unit
          val is_empty : t -> bool
          val top : t -> data
          val pop : t -> data
          val push : key -> data -> t -> unit
          val string_of : t -> string
          val remove : data -> t -> unit
        end
end