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