sig
  module type OrderedType =
    sig
      type t
      val compare : Rangemap.OrderedType.t -> Rangemap.OrderedType.t -> int
      val hash : Rangemap.OrderedType.t -> int
      val descr : Unmarshal.t
    end
  module type ValueType =
    sig
      type t
      val hash : Rangemap.ValueType.t -> int
      val descr : Unmarshal.t
    end
  type fuzzy_order = Above | Below | Match
  module Make :
    functor (Ord : OrderedType->
      functor (Value : ValueType->
        sig
          type key = Ord.t
          type t =
              Empty
            | Node of Rangemap.Make.t * Rangemap.Make.key * Value.t *
                Rangemap.Make.t * int * int
          val descr : Unmarshal.t
          val create :
            Rangemap.Make.t ->
            Rangemap.Make.key ->
            Value.t -> Rangemap.Make.t -> Rangemap.Make.t
          val hash : Rangemap.Make.t -> int
          val empty : Rangemap.Make.t
          val is_empty : Rangemap.Make.t -> bool
          val add :
            Rangemap.Make.key ->
            Value.t -> Rangemap.Make.t -> Rangemap.Make.t
          val find : Rangemap.Make.key -> Rangemap.Make.t -> Value.t
          val remove :
            Rangemap.Make.key -> Rangemap.Make.t -> Rangemap.Make.t
          val mem : Rangemap.Make.key -> Rangemap.Make.t -> bool
          val iter :
            (Rangemap.Make.key -> Value.t -> unit) -> Rangemap.Make.t -> unit
          val map :
            (Value.t -> Value.t) -> Rangemap.Make.t -> Rangemap.Make.t
          val mapi :
            (Rangemap.Make.key -> Value.t -> Value.t) ->
            Rangemap.Make.t -> Rangemap.Make.t
          val mapii :
            (Rangemap.Make.key -> Value.t -> Rangemap.Make.key * Value.t) ->
            Rangemap.Make.t -> Rangemap.Make.t
          val fold :
            (Rangemap.Make.key -> Value.t -> '-> 'a) ->
            Rangemap.Make.t -> '-> 'a
          val compare :
            (Value.t -> Value.t -> int) ->
            Rangemap.Make.t -> Rangemap.Make.t -> int
          val equal :
            (Value.t -> Value.t -> bool) ->
            Rangemap.Make.t -> Rangemap.Make.t -> bool
          val fold_range :
            (Rangemap.Make.key -> Rangemap.fuzzy_order) ->
            (Rangemap.Make.key -> Value.t -> Value.t -> Value.t) ->
            Rangemap.Make.t -> Value.t -> Value.t
          val height : Rangemap.Make.t -> int
          val concerned_intervals :
            (Rangemap.Make.key -> Rangemap.Make.key -> Rangemap.fuzzy_order) ->
            Rangemap.Make.key ->
            Rangemap.Make.t -> (Rangemap.Make.key * Value.t) list
          exception Empty_rangemap
          val lowest_binding : Rangemap.Make.t -> Rangemap.Make.key * Value.t
          exception No_such_binding
          val lowest_binding_above :
            (Rangemap.Make.key -> bool) ->
            Rangemap.Make.t -> Rangemap.Make.key * Value.t
          val merge : Rangemap.Make.t -> Rangemap.Make.t -> Rangemap.Make.t
          val add_whole :
            (Rangemap.Make.key -> Rangemap.Make.key -> Rangemap.fuzzy_order) ->
            Rangemap.Make.key ->
            Value.t -> Rangemap.Make.t -> Rangemap.Make.t
          val remove_whole :
            (Rangemap.Make.key -> Rangemap.Make.key -> Rangemap.fuzzy_order) ->
            Rangemap.Make.key -> Rangemap.Make.t -> Rangemap.Make.t
        end
end