sig
  module type PQ =
    sig
      type 'a t
      val empty : 'a Util.comparator -> 'a PQueue.PQ.t
      val insert : 'a -> 'a PQueue.PQ.t -> 'a PQueue.PQ.t
      val remove : 'a PQueue.PQ.t -> ('a * 'a PQueue.PQ.t) option
      val max : 'a PQueue.PQ.t -> 'a option
      val size : 'a PQueue.PQ.t -> int
      val is_empty : 'a PQueue.PQ.t -> bool
      val comparator : 'a PQueue.PQ.t -> 'a Util.comparator
    end
  module ListImpl : PQ
  module HeapImpl : PQ
  module Heapsort :
    functor (PQ : PQ) ->
      sig val sort : ('a -> 'a -> int) -> 'a list -> 'a list end
end