Builder

:= {
    parser : ArgParser(data),
    options : List(OptionConfig),
    parameters : List(ParameterConfig),
    subcommands : SubcommandsConfig,
}
from_arg_parser : (List(ParsedArg) -> Try({ data : data, remaining_args : List(ParsedArg) }, ArgExtractErr)) -> CliBuilder(data, from_action, to_action)
from_full_parser : ArgParser(data) -> CliBuilder(data, from_action, to_action)
add_option : CliBuilder(state, from_action, to_action), OptionConfig -> CliBuilder(state, from_action, to_action)
add_parameter : CliBuilder(state, from_action, to_action), ParameterConfig -> CliBuilder(state, from_action, to_action)
add_subcommands : CliBuilder(state, from_action, to_action), SubcommandsConfig -> CliBuilder(state, from_action, to_action)
set_parser : CliBuilder(state, from_action, to_action), ArgParser(next_state) -> CliBuilder(next_state, from_action, to_action)
update_parser : CliBuilder(state, from_action, to_action), ({ data : state, remaining_args : List(ParsedArg) } -> Try({ data : next_state, remaining_args : List(ParsedArg) }, ArgExtractErr)) -> CliBuilder(next_state, from_action, to_action)
bind_parser : CliBuilder(state, from_action, to_action), (ArgParserState(state) -> ArgParserResult(ArgParserState(next_state))) -> CliBuilder(next_state, from_action, to_action)
into_parts : CliBuilder(state, from_action, to_action) -> {
    parser : ArgParser(state),
    options : List(OptionConfig),
    parameters : List(ParameterConfig),
    subcommands : SubcommandsConfig,
}
map : CliBuilder(a, from_action, to_action), (a -> b) -> CliBuilder(b, from_action, to_action)
combine : CliBuilder(a, action1, action2), CliBuilder(b, action2, action3), (a, b -> c) -> CliBuilder(c, action1, action3)
CliBuilder : Builder(data, from_action, to_action)