functor (D : S->   sig     type data = D.t     type t = Weak.Make(D).t     val create : int -> t     val clear : t -> unit     val merge : t -> data -> data     val add : t -> data -> unit     val remove : t -> data -> unit     val find : t -> data -> data     val find_all : t -> data -> data list     val mem : t -> data -> bool     val iter : (data -> unit) -> t -> unit     val fold : (data -> '-> 'a) -> t -> '-> 'a     val count : t -> int     val stats : t -> int * int * int * int * int * int     module Datatype :       sig         type t = 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       end   end