
                             d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlmZ  ej                  ddd	g      Z
d
 Z G d d      Zy)zHIterator wrapper that allows checking if an iterator is empty or plural.    )absolute_import)division)unicode_literalsN)
exceptionsBufferedException	exceptionstack_tracec                 ~    t        | t              r,t        j                  | j                  | j
                         y| S )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                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d
dZ
y	)PluralityCheckableIteratoraV  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    t        |      | _        g | _        y)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__z#PluralityCheckableIterator.__init__4   s     (^DNDLr   c                     | S N r   s    r   __iter__z#PluralityCheckableIterator.__iter__@   s    Kr   c                     | j                          | j                  r$t        | j                  j                  d            S t        )Nr   )_populate_bufferr   r   popStopIterationr   s    r   __next__z#PluralityCheckableIterator.__next__C   s5    ||)$,,*:*:1*=>>r   c                 <    | j                          | j                   S r   )r!   r   r   s    r   is_emptyz#PluralityCheckableIterator.is_emptyJ   s    ||r   c                 V    | j                  d       t        | j                        dkD  S )N   num_elements   )r!   lenr   r   s    r   	is_pluralz$PluralityCheckableIterator.is_pluralN   s'    q)t||q  r   c                 p    | j                  d       | j                  rt        | j                  d         S y)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).
    r+   r)   r   N)r!   r   r   r   s    r   peekzPluralityCheckableIterator.peekR   s2     	q)||)$,,q/::r   c                 |   t        | j                        |k  rI	 | j                  j                  t        | j                               t        | j                        |k  rHy y # t
        $ r Y y t        $ rE}| j                  j                  t        |t        j                         d                Y d }~nd }~ww xY w)Nr(   )r   r	   )
r,   r   appendnextr   r#   	Exceptionr   sysexc_info)r   r*   es      r   r!   z+PluralityCheckableIterator._populate_buffer]   s    
dll
l
*D01 dll
l
*   -q)
 	 	s   .A# #	B;.B;6;B66B;N)r+   )__name__
__module____qualname____doc__r   r   r$   r&   r-   r/   r!   r   r   r   r   r   )   s*    
!	
r   r   )r:   
__future__r   r   r   collectionsr4   googlecloudsdk.corer   
namedtupler   r   r   r   r   r   <module>r?      sL    O &  '  
 * +K**-  > >r   