sig
  module type Id_Datatype =
    sig
      type t
      val id : Ptset.Id_Datatype.t -> int
      val name : string
      val pretty : Format.formatter -> Ptset.Id_Datatype.t -> unit
      val equal : Ptset.Id_Datatype.t -> Ptset.Id_Datatype.t -> bool
      module Datatype :
        sig
          type 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) -> unit -> unit
          val is_comparable_set : unit -> bool
          val hash : t -> int
          val equal : t -> t -> bool
          val compare : t -> t -> int
          val mem_project :
            ((Project.project -> bool) -> t -> bool) option ref
        end
    end
  module type S =
    sig
      type elt
      type t
      val descr : Unmarshal.t
      val empty : Ptset.S.t
      val is_empty : Ptset.S.t -> bool
      val mem : Ptset.S.elt -> Ptset.S.t -> bool
      val add : Ptset.S.elt -> Ptset.S.t -> Ptset.S.t
      val singleton : Ptset.S.elt -> Ptset.S.t
      val remove : Ptset.S.elt -> Ptset.S.t -> Ptset.S.t
      val elements : Ptset.S.t -> Ptset.S.elt list
      val union : Ptset.S.t -> Ptset.S.t -> Ptset.S.t
      val inter : Ptset.S.t -> Ptset.S.t -> Ptset.S.t
      val diff : Ptset.S.t -> Ptset.S.t -> Ptset.S.t
      val equal : Ptset.S.t -> Ptset.S.t -> bool
      val subset : Ptset.S.t -> Ptset.S.t -> bool
      val iter : (Ptset.S.elt -> unit) -> Ptset.S.t -> unit
      val fold : (Ptset.S.elt -> '-> 'a) -> Ptset.S.t -> '-> 'a
      val exists : (Ptset.S.elt -> bool) -> Ptset.S.t -> bool
      val filter : (Ptset.S.elt -> bool) -> Ptset.S.t -> Ptset.S.t
      val cardinal : Ptset.S.t -> int
      val min_elt : Ptset.S.t -> Ptset.S.elt
      val contains_single_elt : Ptset.S.t -> Ptset.S.elt option
    end
  module Make :
    functor
      (X : sig
             type t
             val id : Ptset.Make.t -> int
             val name : string
             val pretty : Format.formatter -> Ptset.Make.t -> unit
             val equal : Ptset.Make.t -> Ptset.Make.t -> bool
             module Datatype :
               sig
                 type 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) -> unit -> unit
                 val is_comparable_set : unit -> bool
                 val hash : t -> int
                 val equal : t -> t -> bool
                 val compare : t -> t -> int
                 val mem_project :
                   ((Project.project -> bool) -> t -> bool) option ref
               end
           end->
      sig
        type elt = X.t
        type t
        val descr : Unmarshal.t
        val empty : t
        val is_empty : t -> bool
        val mem : elt -> t -> bool
        val add : elt -> t -> t
        val singleton : elt -> t
        val remove : elt -> t -> t
        val elements : t -> elt list
        val union : t -> t -> t
        val inter : t -> t -> t
        val diff : t -> t -> t
        val equal : t -> t -> bool
        val subset : t -> t -> bool
        val iter : (elt -> unit) -> t -> unit
        val fold : (elt -> '-> 'a) -> t -> '-> 'a
        val exists : (elt -> bool) -> t -> bool
        val filter : (elt -> bool) -> t -> t
        val cardinal : t -> int
        val min_elt : t -> elt
        val contains_single_elt : t -> elt option
      end
end