sig
  type ocaml_interface = [ `Hidden | `Normal | `Opaque ]
  type ocaml_unit = [ `Both | `Ml | `Mli ]
  type c_unit = [ `Both | `C | `H ]
  type kind =
      [ `C of As_part_unit.c_unit
      | `Js
      | `OCaml of As_part_unit.ocaml_unit * As_part_unit.ocaml_interface ]
  val pp_kind : Format.formatter -> As_part_unit.kind -> unit
  val kind : [< `Unit ] As_part.t -> As_part_unit.kind
  val dir : [< `Unit ] As_part.t -> As_path.t As_conf.value
  val ocaml :
    [< As_part.kind ] As_part.t -> [< As_part.kind > `Unit ] As_part.t option
  val c :
    [< As_part.kind ] As_part.t -> [< As_part.kind > `Unit ] As_part.t option
  val js :
    [< As_part.kind ] As_part.t -> [< As_part.kind > `Unit ] As_part.t option
  val v :
    ?usage:As_part.usage ->
    ?exists:bool As_conf.value ->
    ?args:As_args.t ->
    ?needs:[< `Lib | `Pkg ] As_part.t list ->
    ?dir:As_path.t As_conf.value ->
    string -> As_part_unit.kind -> [< As_part.kind > `Unit ] As_part.t
end