sig
  type spec =
      Unit of (unit -> unit)
    | Bool of (bool -> unit)
    | Set of bool Stdlib.ref
    | Clear of bool Stdlib.ref
    | String of (string -> unit)
    | Set_string of string Stdlib.ref
    | Int of (int -> unit)
    | Set_int of int Stdlib.ref
    | Float of (float -> unit)
    | Set_float of float Stdlib.ref
    | Tuple of Arg.spec list
    | Symbol of string list * (string -> unit)
    | Rest of (string -> unit)
    | Rest_all of (string list -> unit)
    | Expand of (string -> string array)
  type key = string
  type doc = string
  type usage_msg = string
  type anon_fun = string -> unit
  val parse :
    (Arg.key * Arg.spec * Arg.doc) list ->
    Arg.anon_fun -> Arg.usage_msg -> unit
  val parse_dynamic :
    (Arg.key * Arg.spec * Arg.doc) list Stdlib.ref ->
    Arg.anon_fun -> Arg.usage_msg -> unit
  val parse_argv :
    ?current:int Stdlib.ref ->
    string array ->
    (Arg.key * Arg.spec * Arg.doc) list ->
    Arg.anon_fun -> Arg.usage_msg -> unit
  val parse_argv_dynamic :
    ?current:int Stdlib.ref ->
    string array ->
    (Arg.key * Arg.spec * Arg.doc) list Stdlib.ref ->
    Arg.anon_fun -> string -> unit
  val parse_and_expand_argv_dynamic :
    int Stdlib.ref ->
    string array Stdlib.ref ->
    (Arg.key * Arg.spec * Arg.doc) list Stdlib.ref ->
    Arg.anon_fun -> string -> unit
  val parse_expand :
    (Arg.key * Arg.spec * Arg.doc) list ->
    Arg.anon_fun -> Arg.usage_msg -> unit
  exception Help of string
  exception Bad of string
  val usage : (Arg.key * Arg.spec * Arg.doc) list -> Arg.usage_msg -> unit
  val usage_string :
    (Arg.key * Arg.spec * Arg.doc) list -> Arg.usage_msg -> string
  val align :
    ?limit:int ->
    (Arg.key * Arg.spec * Arg.doc) list ->
    (Arg.key * Arg.spec * Arg.doc) list
  val current : int Stdlib.ref
  val read_arg : string -> string array
  val read_arg0 : string -> string array
  val write_arg : string -> string array -> unit
  val write_arg0 : string -> string array -> unit
end