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->
      functor (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