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