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