o
    =j  ã                   @   sj   d Z ddlZddlZddlmZ eƒ Ze e¡Z	G dd„ dej
ƒZG dd„ dej
ƒZG dd	„ d	ej
ƒZdS )
z/Helpful utilities related to the stream module.é    N)Ústreamc                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTransformingConsumerzGA stream.Consumer that passes a transformation of its input to another.c                 C   s   || _ || _d S ©N)Ú_transformationÚ_downstream)ÚselfZtransformationZ
downstream© r   úoC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\grpc/framework/foundation/stream_util.pyÚ__init__   s   
zTransformingConsumer.__init__c                 C   ó   | j  |  |¡¡ d S r   )r   Úconsumer   ©r   Úvaluer   r   r	   r       ó   zTransformingConsumer.consumec                 C   s   | j  ¡  d S r   )r   Ú	terminate©r   r   r   r	   r   #   s   zTransformingConsumer.terminatec                 C   r   r   )r   Úconsume_and_terminater   r   r   r   r	   r   &   r   z*TransformingConsumer.consume_and_terminateN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r   r   r   r	   r      s    r   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚIterableConsumerzDA Consumer that when iterated over emits the values it has consumed.c                 C   s   t  ¡ | _g | _d| _d S )NT)Ú	threadingÚ	ConditionÚ
_conditionÚ_valuesÚ_activer   r   r   r	   r
   -   s   

zIterableConsumer.__init__c                 C   sX   | j � | jr| j |¡ | j  ¡  W d   ƒ d S W d   ƒ d S 1 s%w   Y  d S r   ©r   r   r   ÚappendÚnotifyr   r   r   r	   r   2   s   ý"ÿzIterableConsumer.consumec                 C   s<   | j � d| _| j  ¡  W d   ƒ d S 1 sw   Y  d S ©NF)r   r   r   r   r   r   r	   r   8   s   "þzIterableConsumer.terminatec                 C   s^   | j �" | jr| j |¡ d| _| j  ¡  W d   ƒ d S W d   ƒ d S 1 s(w   Y  d S r    r   r   r   r   r	   r   =   s   ü"ÿz&IterableConsumer.consume_and_terminatec                 C   s   | S r   r   r   r   r   r	   Ú__iter__D   s   zIterableConsumer.__iter__c                 C   s   |   ¡ S r   )Únextr   r   r   r	   Ú__next__G   s   zIterableConsumer.__next__c                 C   sd   | j �% | jr| js| j  ¡  | jr| jr
| jr%| j d¡W  d   ƒ S tƒ ‚1 s+w   Y  d S )Nr   )r   r   r   ÚwaitÚpopÚStopIterationr   r   r   r	   r"   J   s   
ÿ
üûzIterableConsumer.nextN)r   r   r   r   r
   r   r   r   r!   r#   r"   r   r   r   r	   r   *   s    r   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚThreadSwitchingConsumerz?A Consumer decorator that affords serialization and asynchrony.c                 C   s,   t  ¡ | _|| _|| _d| _g | _d| _d S ©NFT)r   ÚLockÚ_lockÚ_sinkÚ_poolÚ	_spinningr   r   )r   ÚsinkÚpoolr   r   r	   r
   V   s   

z ThreadSwitchingConsumer.__init__c              
   C   sò   	 z|t u r| ¡  n|r| |¡ n| |¡ W n ty0 } zt |¡ W Y d }~nd }~ww | j�< |rCd| _	 W d   ƒ d S | j	rU| j	 
d¡}| j	 oS| j }n| js]t }d}nd| _	 W d   ƒ d S W d   ƒ n1 ssw   Y  q)NTFr   )Ú	_NO_VALUEr   r   r   Ú	ExceptionÚ_LOGGERÚ	exceptionr*   r-   r   r%   r   )r   r.   r   r   Úer   r   r	   Ú_spin`   s:   

€€ÿýô€ õzThreadSwitchingConsumer._spinc                 C   s‚   | j �4 | jr'| jr| j |¡ n| j | j| j|d¡ d| _W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 s:w   Y  d S r(   ©	r*   r   r-   r   r   r,   Úsubmitr5   r+   r   r   r   r	   r   z   s   úÿ"ýzThreadSwitchingConsumer.consumec                 C   sz   | j �0 | jr#d| _| js+| j | j| jtd¡ d| _W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 s6w   Y  d S r(   )r*   r   r-   r,   r7   r5   r+   r0   r   r   r   r	   r   ƒ   s   ûÿ"ýz!ThreadSwitchingConsumer.terminatec                 C   sˆ   | j �7 | jr*d| _| jr| j |¡ n| j | j| j|d¡ d| _W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 s=w   Y  d S r(   r6   r   r   r   r	   r   ‹   s   ùÿ"üz-ThreadSwitchingConsumer.consume_and_terminateN)	r   r   r   r   r
   r5   r   r   r   r   r   r   r	   r'   S   s    
	r'   )r   Úloggingr   Zgrpc.framework.foundationr   Úobjectr0   Ú	getLoggerr   r2   ZConsumerr   r   r'   r   r   r   r	   Ú<module>   s   
)