sig
  type how =
      Do_Not_Select_Dependencies
    | Select_Dependencies
    | Only_Select_Dependencies
  module type SELECTION =
    sig
      type kind
      type t
      val ty : Kind.SELECTION.t Type.t
      val empty : Kind.SELECTION.t
      val is_empty : Kind.SELECTION.t -> bool
      val add :
        Kind.SELECTION.kind ->
        Kind.how -> Kind.SELECTION.t -> Kind.SELECTION.t
      val singleton : Kind.SELECTION.kind -> Kind.how -> Kind.SELECTION.t
      val remove :
        Kind.SELECTION.kind -> Kind.SELECTION.t -> Kind.SELECTION.t
      val iter :
        (Kind.SELECTION.kind -> Kind.how -> unit) -> Kind.SELECTION.t -> unit
      val fold :
        (Kind.SELECTION.kind -> Kind.how -> '-> 'a) ->
        Kind.SELECTION.t -> '-> 'a
    end
  val version : string Pervasives.ref
  module Make :
    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
end