functor
  (T : sig
         type t
         val dummy : Kind.Make.t
         val name : string
         val kind_name : Kind.Make.t -> string
       end->
  sig
    type t
    val dummy : Kind.Make.t
    module Selection :
      sig
        type kind = t
        type t
        val ty : t Type.t
        val empty : t
        val is_empty : t -> bool
        val add : kind -> how -> t -> t
        val singleton : kind -> how -> t
        val remove : kind -> t -> t
        val iter : (kind -> how -> unit) -> t -> unit
        val fold : (kind -> how -> '-> 'a) -> t -> '-> 'a
      end
    val create : T.t -> Kind.Make.t list -> Kind.Make.t
    val value : Kind.Make.t -> T.t
    exception DependencyAlreadyExists of string * string
    val add_dependency : Kind.Make.t -> Kind.Make.t -> unit
    val iter : (T.t -> '-> unit) -> '-> unit
    val apply_in_order :
      Kind.Make.Selection.t ->
      Kind.Make.Selection.t -> (Kind.Make.t -> '-> 'a) -> '-> 'a
    val iter_in_order :
      Kind.Make.Selection.t ->
      Kind.Make.Selection.t -> (T.t -> '-> unit) -> '-> unit
    val fold_in_order :
      Kind.Make.Selection.t ->
      Kind.Make.Selection.t -> (T.t -> '-> 'a) -> '-> 'a
    val number_of_applicants :
      Kind.Make.Selection.t -> Kind.Make.Selection.t -> int option
    val digest : unit -> Digest.t
    val dump_dependencies :
      ?only:Kind.Make.Selection.t ->
      ?except:Kind.Make.Selection.t -> string -> unit
  end