sig
  type descr =
    Dispatch_arg.descr = {
    name : string option;
    descr : string;
    arg_descr : string;
  }
  type 'a t =
    'Dispatch_arg.t = {
    run : string list -> 'a option;
    doc : descr option;
  }
  module Spec :
    sig
      type ('a, 'b) t = ('a, 'b) Dispatch_arg.Spec.t
      module Result :
        sig
          type ('a, 'b) t = ('a, 'b) Dispatch_arg.Spec.Result.t
          val unit : (unit, string) t
          val ok : (unit, string) t
          val bool : (bool, string) t
          val big_string : (Core.Std.Bigstring.t, string) t
          val string : (string, string) t
          val int : (int, string) t
          val list : ?sep:string -> ('a, string) t -> ('a list, string) t
          val create : ('-> 'b) -> ('a, 'b) t
        end
      module Infix :
        sig
          val ( ++ ) : ('a, 'b) t -> ('c, 'a) t -> ('c, 'b) t
          val ( --> ) : ('a, 'b) t -> ('a, 'c) Result.t -> ('c, 'b) t
        end
      val ( ++ ) : ('a, 'b) t -> ('c, 'a) t -> ('c, 'b) t
      val ( --> ) : ('a, 'b) t -> ('a, 'c) Result.t -> ('c, 'b) t
      val string : string -> ('a, string -> 'a) t
      val int : string -> ('a, int -> 'a) t
      val unit : ('a, unit -> 'a) t
      val list : (unit, '-> unit) t -> ('b, 'a list -> 'b) t
      val option : ('a, '-> 'a) t -> ('a, 'b option -> 'a) t
      val choice : ('a, 'b) t list -> ('a, 'b) t
      val create : (string -> 'a option) -> string -> ('b, '-> 'b) t
      val map1 : f:('-> 'b) -> ('c, '-> 'c) t -> ('c, '-> 'c) t
      val map2 :
        f:('-> '-> 'c) -> ('d, '-> '-> 'd) t -> ('d, '-> 'd) t
      val map3 :
        f:('-> '-> '-> 'd) ->
        ('e, '-> '-> '-> 'e) t -> ('e, '-> 'e) t
    end
  val embed : ?cmd:string -> descr:string -> '-> ('b, 'a) Spec.t -> 'b t
  val declare : ?doc:descr -> (string list -> 'a option) -> 'a t
  val run :
    ?prog_name:string ->
    ?args:string list -> ?global:Core.Std.Arg.t list -> string t list -> 'a
  val run_gen :
    ?prog_name:string ->
    ?args:string list -> ?global:Core.Std.Arg.t list -> 'a t list -> 'a
  type shell =
    Dispatch_arg.shell = {
    prompt : unit -> string;
    quit : 'a. unit -> 'a;
    err : exn -> unit;
  }
  val default_shell : shell
  val shell : shell -> ?global:Core.Std.Arg.t list -> string t list -> 'a
end