
                             S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKJr  \R                  " SSS	/5      r
S
 r " S S5      rg)zHIterator wrapper that allows checking if an iterator is empty or plural.    )absolute_import)division)unicode_literalsN)
exceptionsBufferedException	exceptionstack_tracec                     [        U [        5      (       a*  [        R                  " U R                  U R
                  S9  gU $ )z>Detects and raises BufferedException's or simply returns item.)tbN)
isinstancer   r   reraiser   r	   )items    Flib/googlecloudsdk/command_lib/storage/plurality_checkable_iterator.py_get_item_or_raise_exceptionr   !   s/    '((t~~$*:*:;K    c                   F    \ rS rSrSrS rS rS rS rS r	S r
SS	 jrS
rg)PluralityCheckableIterator)   aJ  Iterator that can check if no items or more than one item can be yielded.

This iterator accepts two types of values from an iterator it wraps:
  1. A yielded item.
  2. A raised exception, which will be buffered and re-raised when it
     is reached in this iterator.

Both types count when determining the number of items left.
c                 2    [        U5      U l        / U l        g)zInitilizes a PluralityCheckableIterator instance.

Args:
  iterable: An iterable to be wrapped.
    PluralityCheckableIterator yields items from this iterable and checks
    its plurality and emptiness.
N)iter	_iterator_buffer)selfiterables     r   __init__#PluralityCheckableIterator.__init__4   s     (^DNDLr   c                     U $ N r   s    r   __iter__#PluralityCheckableIterator.__iter__@   s    Kr   c                     U R                  5         U R                  (       a$  [        U R                  R                  S5      5      $ [        e)Nr   )_populate_bufferr   r   popStopIterationr    s    r   __next__#PluralityCheckableIterator.__next__C   s5    ||)$,,*:*:1*=>>r   c                 D    U R                  5         U R                  (       + $ r   )r$   r   r    s    r   is_empty#PluralityCheckableIterator.is_emptyJ   s    ||r   c                 P    U R                  SS9  [        U R                  5      S:  $ )N   num_elements   )r$   lenr   r    s    r   	is_plural$PluralityCheckableIterator.is_pluralN   s'    q)t||q  r   c                 t    U R                  SS9  U R                  (       a  [        U R                  S   5      $ g)zGet first item of iterator without removing it from buffer.

Returns:
  First item of iterator or None if empty iterator (or first item is None).
r0   r.   r   N)r$   r   r   r    s    r   peekPluralityCheckableIterator.peekR   s2     	q)||)$,,q/::r   c                    [        U R                  5      U:  aK   U R                  R                  [        U R                  5      5        [        U R                  5      U:  a  MJ  g g ! [
         a     g [         aC  nU R                  R                  [        U[        R                  " 5       S   S95         S nANpS nAff = f)Nr-   )r   r	   )
r1   r   appendnextr   r&   	Exceptionr   sysexc_info)r   r/   es      r   r$   +PluralityCheckableIterator._populate_buffer]   s    
dll
l
*D01 dll
l
*   -q)
 	 	s   .A& &
B>2	B>;9B99B>)r   r   N)r0   )__name__
__module____qualname____firstlineno____doc__r   r!   r'   r*   r2   r5   r$   __static_attributes__r   r   r   r   r   )   s*    
!	
r   r   )rC   
__future__r   r   r   collectionsr;   googlecloudsdk.corer   
namedtupler   r   r   r   r   r   <module>rI      sJ    O &  '  
 *  **-  > >r   