sig
  type spec =
    Arg.spec =
      Unit of (unit -> unit)
    | Bool of (bool -> unit)
    | Set of bool ref
    | Clear of bool ref
    | String of (string -> unit)
    | Set_string of string ref
    | Int of (int -> unit)
    | Set_int of int ref
    | Float of (float -> unit)
    | Set_float of float ref
    | Tuple of spec list
    | Symbol of string list * (string -> unit)
    | Rest of (string -> unit)
  type key = string
  type doc = key
  type usage_msg = doc
  type anon_fun = usage_msg -> unit
  val parse :
    (usage_msg * spec * usage_msg) list -> anon_fun -> usage_msg -> unit
  val parse_argv :
    ?current:int ref ->
    usage_msg array ->
    (usage_msg * spec * usage_msg) list -> anon_fun -> usage_msg -> unit
  exception Help of usage_msg
  exception Bad of usage_msg
  val usage : (usage_msg * spec * usage_msg) list -> usage_msg -> unit
  val usage_string :
    (usage_msg * spec * usage_msg) list -> usage_msg -> usage_msg
  val align :
    (usage_msg * spec * usage_msg) list ->
    (usage_msg * spec * usage_msg) list
  val current : int ref
  type t = usage_msg * spec * usage_msg
  val sort_and_align :
    (usage_msg * spec * usage_msg) list ->
    (usage_msg * spec * usage_msg) list
end