sig
  module type Tagged_type =
    sig
      type t
      val tag : Ptmap.Tagged_type.t -> int
      val equal : Ptmap.Tagged_type.t -> Ptmap.Tagged_type.t -> bool
      val pretty : Format.formatter -> Ptmap.Tagged_type.t -> unit
      module Datatype :
        sig
          type t = t
          val rehash : t -> t
          val descr : Unmarshal.t
          val copy : t -> t
          val name : string
          val register_comparable :
            ?compare:(t -> t -> int) ->
            ?equal:(t -> t -> bool) ->
            ?hash:(t -> int) -> ?physical_hash:(t -> int) -> unit -> unit
          val is_comparable_set : unit -> bool
          val hash : t -> int
          val physical_hash : t -> int
          val equal : t -> t -> bool
          val compare : t -> t -> int
          val contain_project : (Project.project -> t -> bool) option ref
        end
    end
  module Generic :
    functor
      (X : sig
             type t
             val name : string
             val id : Ptmap.Generic.t -> int
             val pretty : Format.formatter -> Ptmap.Generic.t -> unit
           end->
      functor (V : Tagged_type->
        functor (Initial_Values : sig val v : (X.t * V.t) list list end->
          sig
            type t
            type key = X.t
            val empty : Ptmap.Generic.t
            val tag : Ptmap.Generic.t -> int
            val hash_debug : Ptmap.Generic.t -> int
            val equal : Ptmap.Generic.t -> Ptmap.Generic.t -> bool
            val is_empty : Ptmap.Generic.t -> bool
            val add :
              Ptmap.Generic.key -> V.t -> Ptmap.Generic.t -> Ptmap.Generic.t
            val find : Ptmap.Generic.key -> Ptmap.Generic.t -> V.t
            val remove :
              Ptmap.Generic.key -> Ptmap.Generic.t -> Ptmap.Generic.t
            val iter : (X.t -> V.t -> unit) -> Ptmap.Generic.t -> unit
            val map : (V.t -> V.t) -> Ptmap.Generic.t -> Ptmap.Generic.t
            val fold :
              (X.t -> V.t -> '-> 'a) -> Ptmap.Generic.t -> '-> 'a
            val generic_merge :
              cache:string * int ->
              decide:(X.t -> V.t option -> V.t option -> V.t) ->
              Ptmap.Generic.t -> Ptmap.Generic.t -> Ptmap.Generic.t
            val symetric_merge :
              cache:string * int ->
              decide_none:(X.t -> V.t -> V.t) ->
              decide_some:(V.t -> V.t -> V.t) ->
              Ptmap.Generic.t -> Ptmap.Generic.t -> Ptmap.Generic.t
            val generic_is_included :
              exn ->
              cache:string * int ->
              decide_fst:(X.t -> V.t -> unit) ->
              decide_snd:(X.t -> V.t -> unit) ->
              decide_both:(V.t -> V.t -> unit) ->
              Ptmap.Generic.t -> Ptmap.Generic.t -> unit
            val cached_fold :
              cache:string * int ->
              f:(Ptmap.Generic.key -> V.t -> 'a) ->
              joiner:('-> '-> 'a) -> empty:'-> Ptmap.Generic.t -> 'a
            val cached_map :
              cache:string * int ->
              f:(Ptmap.Generic.key -> V.t -> V.t) ->
              Ptmap.Generic.t -> Ptmap.Generic.t
            module Datatype :
              sig
                type t = t
                val rehash : t -> t
                val descr : Unmarshal.t
                val copy : t -> t
                val name : string
                val register_comparable :
                  ?compare:(t -> t -> int) ->
                  ?equal:(t -> t -> bool) ->
                  ?hash:(t -> int) ->
                  ?physical_hash:(t -> int) -> unit -> unit
                val is_comparable_set : unit -> bool
                val hash : t -> int
                val physical_hash : t -> int
                val equal : t -> t -> bool
                val compare : t -> t -> int
                val contain_project :
                  (Project.project -> t -> bool) option ref
              end
          end
end