sig
  module type OrderedType =
    sig
      type t
      val compare : Pqueue.OrderedType.t -> Pqueue.OrderedType.t -> int
    end
  module type Min =
    sig
      type t
      type elt
      val create : unit -> Pqueue.Min.t
      val length : Pqueue.Min.t -> int
      val is_empty : Pqueue.Min.t -> bool
      val add : Pqueue.Min.t -> Pqueue.Min.elt -> unit
      val add_iter :
        Pqueue.Min.t ->
        ((Pqueue.Min.elt -> unit) -> '-> unit) -> '-> unit
      val min_elt : Pqueue.Min.t -> Pqueue.Min.elt option
      val get_min_elt : Pqueue.Min.t -> Pqueue.Min.elt
      val pop_min : Pqueue.Min.t -> Pqueue.Min.elt option
      val remove_min : Pqueue.Min.t -> unit
      val clear : Pqueue.Min.t -> unit
      val copy : Pqueue.Min.t -> Pqueue.Min.t
      val of_array : Pqueue.Min.elt array -> Pqueue.Min.t
      val of_list : Pqueue.Min.elt list -> Pqueue.Min.t
      val of_iter :
        ((Pqueue.Min.elt -> unit) -> '-> unit) -> '-> Pqueue.Min.t
      val iter_unordered : (Pqueue.Min.elt -> unit) -> Pqueue.Min.t -> unit
      val fold_unordered :
        ('acc -> Pqueue.Min.elt -> 'acc) -> 'acc -> Pqueue.Min.t -> 'acc
    end
  module MakeMin :
    (E : OrderedType->
      sig
        type t
        val create : unit -> t
        val length : t -> int
        val is_empty : t -> bool
        val add : t -> E.t -> unit
        val add_iter : t -> ((E.t -> unit) -> '-> unit) -> '-> unit
        val min_elt : t -> E.t option
        val get_min_elt : t -> E.t
        val pop_min : t -> E.t option
        val remove_min : t -> unit
        val clear : t -> unit
        val copy : t -> t
        val of_array : E.t array -> t
        val of_list : E.t list -> t
        val of_iter : ((E.t -> unit) -> '-> unit) -> '-> t
        val iter_unordered : (E.t -> unit) -> t -> unit
        val fold_unordered : ('acc -> E.t -> 'acc) -> 'acc -> t -> 'acc
      end
  module type Max =
    sig
      type t
      type elt
      val create : unit -> Pqueue.Max.t
      val length : Pqueue.Max.t -> int
      val is_empty : Pqueue.Max.t -> bool
      val add : Pqueue.Max.t -> Pqueue.Max.elt -> unit
      val add_iter :
        Pqueue.Max.t ->
        ((Pqueue.Max.elt -> unit) -> '-> unit) -> '-> unit
      val max_elt : Pqueue.Max.t -> Pqueue.Max.elt option
      val get_max_elt : Pqueue.Max.t -> Pqueue.Max.elt
      val pop_max : Pqueue.Max.t -> Pqueue.Max.elt option
      val remove_max : Pqueue.Max.t -> unit
      val clear : Pqueue.Max.t -> unit
      val copy : Pqueue.Max.t -> Pqueue.Max.t
      val of_array : Pqueue.Max.elt array -> Pqueue.Max.t
      val of_list : Pqueue.Max.elt list -> Pqueue.Max.t
      val of_iter :
        ((Pqueue.Max.elt -> unit) -> '-> unit) -> '-> Pqueue.Max.t
      val iter_unordered : (Pqueue.Max.elt -> unit) -> Pqueue.Max.t -> unit
      val fold_unordered :
        ('acc -> Pqueue.Max.elt -> 'acc) -> 'acc -> Pqueue.Max.t -> 'acc
    end
  module MakeMax :
    (E : OrderedType->
      sig
        type t
        val create : unit -> t
        val length : t -> int
        val is_empty : t -> bool
        val add : t -> E.t -> unit
        val add_iter : t -> ((E.t -> unit) -> '-> unit) -> '-> unit
        val max_elt : t -> E.t option
        val get_max_elt : t -> E.t
        val pop_max : t -> E.t option
        val remove_max : t -> unit
        val clear : t -> unit
        val copy : t -> t
        val of_array : E.t array -> t
        val of_list : E.t list -> t
        val of_iter : ((E.t -> unit) -> '-> unit) -> '-> t
        val iter_unordered : (E.t -> unit) -> t -> unit
        val fold_unordered : ('acc -> E.t -> 'acc) -> 'acc -> t -> 'acc
      end
  module type OrderedPolyType =
    sig
      type 'a t
      val compare :
        'Pqueue.OrderedPolyType.t -> 'Pqueue.OrderedPolyType.t -> int
    end
  module type MinPoly =
    sig
      type 'a t
      type 'a elt
      val create : unit -> 'Pqueue.MinPoly.t
      val length : 'Pqueue.MinPoly.t -> int
      val is_empty : 'Pqueue.MinPoly.t -> bool
      val add : 'Pqueue.MinPoly.t -> 'Pqueue.MinPoly.elt -> unit
      val add_iter :
        'Pqueue.MinPoly.t ->
        (('Pqueue.MinPoly.elt -> unit) -> '-> unit) -> '-> unit
      val min_elt : 'Pqueue.MinPoly.t -> 'Pqueue.MinPoly.elt option
      val get_min_elt : 'Pqueue.MinPoly.t -> 'Pqueue.MinPoly.elt
      val pop_min : 'Pqueue.MinPoly.t -> 'Pqueue.MinPoly.elt option
      val remove_min : 'Pqueue.MinPoly.t -> unit
      val clear : 'Pqueue.MinPoly.t -> unit
      val copy : 'Pqueue.MinPoly.t -> 'Pqueue.MinPoly.t
      val of_array : 'Pqueue.MinPoly.elt array -> 'Pqueue.MinPoly.t
      val of_list : 'Pqueue.MinPoly.elt list -> 'Pqueue.MinPoly.t
      val of_iter :
        (('Pqueue.MinPoly.elt -> unit) -> '-> unit) ->
        '-> 'Pqueue.MinPoly.t
      val iter_unordered :
        ('Pqueue.MinPoly.elt -> unit) -> 'Pqueue.MinPoly.t -> unit
      val fold_unordered :
        ('acc -> 'Pqueue.MinPoly.elt -> 'acc) ->
        'acc -> 'Pqueue.MinPoly.t -> 'acc
    end
  module MakeMinPoly :
    (E : OrderedPolyType->
      sig
        type 'a t
        val create : unit -> 'a t
        val length : 'a t -> int
        val is_empty : 'a t -> bool
        val add : 'a t -> 'E.t -> unit
        val add_iter : 'a t -> (('E.t -> unit) -> '-> unit) -> '-> unit
        val min_elt : 'a t -> 'E.t option
        val get_min_elt : 'a t -> 'E.t
        val pop_min : 'a t -> 'E.t option
        val remove_min : 'a t -> unit
        val clear : 'a t -> unit
        val copy : 'a t -> 'a t
        val of_array : 'E.t array -> 'a t
        val of_list : 'E.t list -> 'a t
        val of_iter : (('E.t -> unit) -> '-> unit) -> '-> 'a t
        val iter_unordered : ('E.t -> unit) -> 'a t -> unit
        val fold_unordered : ('acc -> 'E.t -> 'acc) -> 'acc -> 'a t -> 'acc
      end
  module type MaxPoly =
    sig
      type 'a t
      type 'a elt
      val create : unit -> 'Pqueue.MaxPoly.t
      val length : 'Pqueue.MaxPoly.t -> int
      val is_empty : 'Pqueue.MaxPoly.t -> bool
      val add : 'Pqueue.MaxPoly.t -> 'Pqueue.MaxPoly.elt -> unit
      val add_iter :
        'Pqueue.MaxPoly.t ->
        (('Pqueue.MaxPoly.elt -> unit) -> '-> unit) -> '-> unit
      val max_elt : 'Pqueue.MaxPoly.t -> 'Pqueue.MaxPoly.elt option
      val get_max_elt : 'Pqueue.MaxPoly.t -> 'Pqueue.MaxPoly.elt
      val pop_max : 'Pqueue.MaxPoly.t -> 'Pqueue.MaxPoly.elt option
      val remove_max : 'Pqueue.MaxPoly.t -> unit
      val clear : 'Pqueue.MaxPoly.t -> unit
      val copy : 'Pqueue.MaxPoly.t -> 'Pqueue.MaxPoly.t
      val of_array : 'Pqueue.MaxPoly.elt array -> 'Pqueue.MaxPoly.t
      val of_list : 'Pqueue.MaxPoly.elt list -> 'Pqueue.MaxPoly.t
      val of_iter :
        (('Pqueue.MaxPoly.elt -> unit) -> '-> unit) ->
        '-> 'Pqueue.MaxPoly.t
      val iter_unordered :
        ('Pqueue.MaxPoly.elt -> unit) -> 'Pqueue.MaxPoly.t -> unit
      val fold_unordered :
        ('acc -> 'Pqueue.MaxPoly.elt -> 'acc) ->
        'acc -> 'Pqueue.MaxPoly.t -> 'acc
    end
  module MakeMaxPoly :
    (E : OrderedPolyType->
      sig
        type 'a t
        val create : unit -> 'a t
        val length : 'a t -> int
        val is_empty : 'a t -> bool
        val add : 'a t -> 'E.t -> unit
        val add_iter : 'a t -> (('E.t -> unit) -> '-> unit) -> '-> unit
        val max_elt : 'a t -> 'E.t option
        val get_max_elt : 'a t -> 'E.t
        val pop_max : 'a t -> 'E.t option
        val remove_max : 'a t -> unit
        val clear : 'a t -> unit
        val copy : 'a t -> 'a t
        val of_array : 'E.t array -> 'a t
        val of_list : 'E.t list -> 'a t
        val of_iter : (('E.t -> unit) -> '-> unit) -> '-> 'a t
        val iter_unordered : ('E.t -> unit) -> 'a t -> unit
        val fold_unordered : ('acc -> 'E.t -> 'acc) -> 'acc -> 'a t -> 'acc
      end
end