sig
  exception OVERFLOW
  module type OrderedType =
    sig
      type t
      val compare : Heap.OrderedType.t -> Heap.OrderedType.t -> int
      val to_string : Heap.OrderedType.t -> string
    end
  module Heap :
    functor (Ord : OrderedType->
      sig
        type data = Ord.t
        type t
        val create : Heap.Heap.data -> Heap.Heap.t
        val add : Heap.Heap.t -> Heap.Heap.data -> unit
        val min : Heap.Heap.t -> Heap.Heap.data
        val remove_min : Heap.Heap.t -> Heap.Heap.data
        val iter : (Heap.Heap.data -> unit) -> Heap.Heap.t -> unit
        val is_empty : Heap.Heap.t -> bool
        val size : Heap.Heap.t -> int
      end
  module MinMaxHeap :
    functor (Ord : OrderedType->
      sig
        type data = Ord.t
        type t
        val create : Heap.MinMaxHeap.data -> Heap.MinMaxHeap.t
        val add : Heap.MinMaxHeap.t -> Heap.MinMaxHeap.data -> unit
        val min : Heap.MinMaxHeap.t -> Heap.MinMaxHeap.data
        val max : Heap.MinMaxHeap.t -> Heap.MinMaxHeap.data
        val remove_min : Heap.MinMaxHeap.t -> Heap.MinMaxHeap.data
        val remove_max : Heap.MinMaxHeap.t -> Heap.MinMaxHeap.data
        val iter :
          (Heap.MinMaxHeap.data -> unit) -> Heap.MinMaxHeap.t -> unit
        val is_empty : Heap.MinMaxHeap.t -> bool
        val size : Heap.MinMaxHeap.t -> int
        val to_string : Heap.MinMaxHeap.t -> string
      end
end