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