sig
  type tag = [ `Tag of string ]
  type language = [ `C | `Js | `Lang of string | `OCaml ]
  type build_phase =
      [ `Archive of [ `Shared | `Static ]
      | `Compile
      | `Dep
      | `Doc
      | `Gen
      | `Link
      | `Pp ]
  type source = [ `Src of As_path.ext ]
  type target =
      [ `Target of [ `Byte | `Js | `Native | `Other of string | `Src ] ]
  type cmd = [ `Cmd of string As_conf.key | `Cmd_static of string ]
  type part_usage =
      [ `Build | `Dev | `Doc | `Other of string | `Outcome | `Test ]
  type part_kind =
      [ `Base | `Bin | `Dir | `Doc | `Lib | `Pkg | `Run | `Unit ]
  type part =
      [ `Part of
          [ `Base
          | `Bin
          | `Build
          | `Dev
          | `Dir
          | `Doc
          | `Lib
          | `Name of string
          | `Other of string
          | `Outcome
          | `Pkg
          | `Run
          | `Test
          | `Unit ] ]
  type elt =
      [ `Archive of [ `Shared | `Static ]
      | `C
      | `Cmd of string As_conf.key
      | `Cmd_static of string
      | `Compile
      | `Dep
      | `Doc
      | `Gen
      | `Js
      | `Lang of string
      | `Link
      | `OCaml
      | `Part of
          [ `Base
          | `Bin
          | `Build
          | `Dev
          | `Dir
          | `Doc
          | `Lib
          | `Name of string
          | `Other of string
          | `Outcome
          | `Pkg
          | `Run
          | `Test
          | `Unit ]
      | `Pp
      | `Src of As_path.ext
      | `Tag of string
      | `Target of [ `Byte | `Js | `Native | `Other of string | `Src ] ]
  val pp_elt : Format.formatter -> As_ctx.elt -> unit
  val pp_kind : Format.formatter -> As_ctx.part_kind -> unit
  val pp_usage : Format.formatter -> As_ctx.part_usage -> unit
  type t
  val v : As_ctx.elt list -> As_ctx.t
  val empty : t
  val is_empty : t -> bool
  val mem : elt -> t -> bool
  val add : elt -> t -> t
  val singleton : elt -> t
  val remove : elt -> t -> t
  val union : t -> t -> t
  val inter : t -> t -> t
  val diff : t -> t -> t
  val compare : t -> t -> int
  val equal : t -> t -> bool
  val subset : t -> t -> bool
  val iter : (elt -> unit) -> t -> unit
  val fold : (elt -> '-> 'a) -> t -> '-> 'a
  val for_all : (elt -> bool) -> t -> bool
  val exists : (elt -> bool) -> t -> bool
  val filter : (elt -> bool) -> t -> t
  val partition : (elt -> bool) -> t -> t * t
  val cardinal : t -> int
  val elements : t -> elt list
  val min_elt : t -> elt
  val max_elt : t -> elt
  val choose : t -> elt
  val split : elt -> t -> t * bool * t
  val find : elt -> t -> elt
  val pp : Format.formatter -> As_ctx.t -> unit
  val matches : As_ctx.t -> As_ctx.t -> bool
end