sig
  module type S =
    sig
      type key
      type value
      type rangemap
      type t = rangemap
      val ty : t Type.t
      val name : string
      val descr : t Descr.t
      val packed_descr : Structural_descr.pack
      val reprs : t list
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val hash : t -> int
      val pretty_code : Format.formatter -> t -> unit
      val internal_pretty_code :
        Type.precedence -> Format.formatter -> t -> unit
      val pretty : Format.formatter -> t -> unit
      val varname : t -> string
      val mem_project : (Project_skeleton.t -> bool) -> t -> bool
      val copy : t -> t
      val create : t -> Rangemap.S.key -> Rangemap.S.value -> t -> t
      val empty : t
      val is_empty : t -> bool
      val add : Rangemap.S.key -> Rangemap.S.value -> t -> t
      val singleton : Rangemap.S.key -> Rangemap.S.value -> t
      val find : Rangemap.S.key -> t -> Rangemap.S.value
      val remove : Rangemap.S.key -> t -> t
      val mem : Rangemap.S.key -> t -> bool
      val iter : (Rangemap.S.key -> Rangemap.S.value -> unit) -> t -> unit
      val map : (Rangemap.S.value -> Rangemap.S.value) -> t -> t
      val mapi :
        (Rangemap.S.key -> Rangemap.S.value -> Rangemap.S.value) -> t -> t
      val mapii :
        (Rangemap.S.key ->
         Rangemap.S.value -> Rangemap.S.key * Rangemap.S.value) ->
        t -> t
      val fold :
        (Rangemap.S.key -> Rangemap.S.value -> '-> 'a) -> t -> '-> 'a
      val for_all : (Rangemap.S.key -> Rangemap.S.value -> bool) -> t -> bool
      val exists : (Rangemap.S.key -> Rangemap.S.value -> bool) -> t -> bool
      val filter : (Rangemap.S.key -> Rangemap.S.value -> bool) -> t -> t
      val partition :
        (Rangemap.S.key -> Rangemap.S.value -> bool) -> t -> t * t
      val cardinal : t -> int
      val bindings : t -> (Rangemap.S.key * Rangemap.S.value) list
      val min_binding : t -> Rangemap.S.key * Rangemap.S.value
      val max_binding : t -> Rangemap.S.key * Rangemap.S.value
      val choose : t -> Rangemap.S.key * Rangemap.S.value
      val merge :
        (Rangemap.S.key ->
         Rangemap.S.value option ->
         Rangemap.S.value option -> Rangemap.S.value option) ->
        t -> t -> t
      val for_all2 :
        (Rangemap.S.key ->
         Rangemap.S.value option -> Rangemap.S.value option -> bool) ->
        t -> t -> bool
      val exists2 :
        (Rangemap.S.key ->
         Rangemap.S.value option -> Rangemap.S.value option -> bool) ->
        t -> t -> bool
      val iter2 :
        (Rangemap.S.key ->
         Rangemap.S.value option -> Rangemap.S.value option -> unit) ->
        t -> t -> unit
      val fold2 :
        (Rangemap.S.key ->
         Rangemap.S.value option -> Rangemap.S.value option -> '-> 'a) ->
        t -> t -> '-> 'a
    end
  type fuzzy_order = Above | Below | Match
  module type Value =
    sig
      type t
      val ty : t Type.t
      val name : string
      val descr : t Descr.t
      val packed_descr : Structural_descr.pack
      val reprs : t list
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val hash : t -> int
      val pretty_code : Format.formatter -> t -> unit
      val internal_pretty_code :
        Type.precedence -> Format.formatter -> t -> unit
      val pretty : Format.formatter -> t -> unit
      val varname : t -> string
      val mem_project : (Project_skeleton.t -> bool) -> t -> bool
      val copy : t -> t
      val fast_equal : t -> t -> bool
    end
  module Make :
    functor (Ord : Datatype.S) (Value : Value->
      sig
        type key = Ord.t
        type value = Value.t
        type rangemap
        type t = rangemap
        val ty : t Type.t
        val name : string
        val descr : t Descr.t
        val packed_descr : Structural_descr.pack
        val reprs : t list
        val equal : t -> t -> bool
        val compare : t -> t -> int
        val hash : t -> int
        val pretty_code : Format.formatter -> t -> unit
        val internal_pretty_code :
          Type.precedence -> Format.formatter -> t -> unit
        val pretty : Format.formatter -> t -> unit
        val varname : t -> string
        val mem_project : (Project_skeleton.t -> bool) -> t -> bool
        val copy : t -> t
        val create : t -> key -> value -> t -> t
        val empty : t
        val is_empty : t -> bool
        val add : key -> value -> t -> t
        val singleton : key -> value -> t
        val find : key -> t -> value
        val remove : key -> t -> t
        val mem : key -> t -> bool
        val iter : (key -> value -> unit) -> t -> unit
        val map : (value -> value) -> t -> t
        val mapi : (key -> value -> value) -> t -> t
        val mapii : (key -> value -> key * value) -> t -> t
        val fold : (key -> value -> '-> 'a) -> t -> '-> 'a
        val for_all : (key -> value -> bool) -> t -> bool
        val exists : (key -> value -> bool) -> t -> bool
        val filter : (key -> value -> bool) -> t -> t
        val partition : (key -> value -> bool) -> t -> t * t
        val cardinal : t -> int
        val bindings : t -> (key * value) list
        val min_binding : t -> key * value
        val max_binding : t -> key * value
        val choose : t -> key * value
        val merge :
          (key -> value option -> value option -> value option) ->
          t -> t -> t
        val for_all2 :
          (key -> value option -> value option -> bool) -> t -> t -> bool
        val exists2 :
          (key -> value option -> value option -> bool) -> t -> t -> bool
        val iter2 :
          (key -> value option -> value option -> unit) -> t -> t -> unit
        val fold2 :
          (key -> value option -> value option -> '-> 'a) ->
          t -> t -> '-> 'a
        val fold_range :
          (key -> Rangemap.fuzzy_order) ->
          (key -> Rangemap.Value.t -> '-> 'a) -> t -> '-> 'a
        val height : t -> int
        val concerned_intervals :
          (key -> key -> Rangemap.fuzzy_order) ->
          key -> t -> (key * Rangemap.Value.t) list
        exception Empty_rangemap
        val lowest_binding : t -> key * Rangemap.Value.t
        exception No_such_binding
        val lowest_binding_above :
          (key -> bool) -> t -> key * Rangemap.Value.t
        val add_whole :
          (key -> key -> Rangemap.fuzzy_order) ->
          key -> Rangemap.Value.t -> t -> t
        val remove_whole :
          (key -> key -> Rangemap.fuzzy_order) -> key -> t -> t
      end
end