
    h                        S r SSKJr  SSKrSSKJrJr  \(       a  SSKJr  \R                   " S S5      5       r
 S
       SS	 jjrg)zDBacktracking parser for handling variable-length argument sequences.    )annotationsN)TYPE_CHECKINGAny   )PrimitiveConstructorSpecc                  L    \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   S\S
'   Srg)BacktrackState   zState for backtracking parser.intspec_idxarg_idxz
Any | Noneparsed_valuezBacktrackState | Noneparentnargs_option_idx N)__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r       Y/home/james-whalen/.local/lib/python3.13/site-packages/tyro/constructors/_backtracking.pyr	   r	      s!    (ML!!r   r	   c           
       ^ [        U5      S:  d   S5       e[        SSSSS5      /nS	S jnU(       Ga  UR                  5       nUR                  nUR                  nUR
                  nU(       aK  U[        U 5      :X  a+  [        U5      S:  a  U[        U5      -  S:w  a  Mu  U" U5      $ X[        U5      -     mO=U[        U5      :X  a  U[        U 5      :X  a  U" U5      $ M  U[        U 5      :X  a  M  X   mTR                  S:X  a#  [        [        [        U 5      U-
  SS5      5      n	O8[        TR                  [        5      (       a  TR                  4OTR                  n	U[        U	5      :  a  GMH  US-   [        U	5      :  a5  UR                  [        UUUR                  UR                  US-   5      5        X   n
Xz-   [        U 5      :  a  GM  XXz-    nTR                  b  [        U4S jU 5       5      (       a  GM   TR!                  U5      nUS-   nUR                  [        UXz-   UUS5      5        U(       a  GM  g! ["         a     GM'  f = f)
aj  Parse arguments using backtracking when specs have variable nargs.

Args:
    args: List of string arguments to parse.
    specs: Tuple of PrimitiveConstructorSpec instances.
    is_repeating: If True with single spec, use specs[0] repeatedly.
        If True with multiple specs, repeat the entire sequence of specs.
        If False, use each spec in order exactly once.

Returns:
    List of parsed values if successful, None if no valid parse exists.

Examples:
    # For sequences like List[Union[int, Tuple[int, int]]]:
    result = parse_with_backtracking(
        args=["1", "2", "3", "4"],
        specs=(spec_with_nargs_1_or_2,),
        is_repeating=True
    )

    # For dicts like Dict[str, Union[int, Tuple[int, int]]]:
    result = parse_with_backtracking(
        args=["key1", "1", "2", "key2", "3"],
        specs=(key_spec, val_spec),
        is_repeating=True
    )

    # For tuples like Tuple[Union[int, str], Union[float, Tuple[float, float]]]:
    result = parse_with_backtracking(
        args=["hello", "1.5", "2.5"],
        specs=(int_or_str_spec, float_or_pair_spec),
        is_repeating=False
    )
r   zAt least one spec is requiredr   Nc                    / nU nUb9  UR                   b  UR                  UR                  5        UR                   nUb  M9  [        [	        U5      5      $ )z3Reconstruct the parsed values from the state chain.)r   appendr   listreversed)stateresultcurrents      r   reconstruct_path1parse_with_backtracking.<locals>.reconstruct_pathD   sQ    ).!~~)g223nnG ! HV$%%r   *c              3  @   >#    U  H  oTR                   ;  v   M     g 7f)N)choices).0argspecs     r   	<genexpr>*parse_with_backtracking.<locals>.<genexpr>   s      ,
/=t||#~s   )r    r	   returnz	list[Any])lenr	   popr   r   r   nargstuplerange
isinstancer   r   r   r   r(   anyinstance_from_str
ValueError)argsspecsis_repeatingstackr#   r    r   r   r   nargs_optionsnargs_optioncandidate_argsparsednext_spec_idxr+   s                 @r   parse_with_backtrackingrA      sO   P u:?;;;? $2!QdA#F"GE& 		>>-- 11 #d)#u:>hU&;q&@'..CJ./D 3u:%c$i'+E22#d)#?D :: "%D	G(;R"DEM-7

C-H-HTZZMdjjM s=11 a#m"44LL&&LL$q( %6!CI- (>?<<# ,
/=,
 )
 )
 	++N;F$qLM LL!*I %d   		s   6I 
II)F)r8   z	list[str]r9   z)tuple[PrimitiveConstructorSpec[Any], ...]r:   boolr.   zlist[Any] | None)r   
__future__r   dataclassestypingr   r   _primitive_specr   	dataclassr	   rA   r   r   r   <module>rH      si    J "  %9    I
I4I I 	Ir   