U
    "FZh¤  ã                   @   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   úl/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/grpc/framework/foundation/stream_util.pyÚ__init__   s    zTransformingConsumer.__init__c                 C   s   | j  |  |¡¡ d S r   )r   Úconsumer   ©r   Úvaluer   r   r	   r       s    zTransformingConsumer.consumec                 C   s   | j  ¡  d S r   )r   Ú	terminate©r   r   r   r	   r   #   s    zTransformingConsumer.terminatec                 C   s   | j  |  |¡¡ d S r   )r   Úconsume_and_terminater   r   r   r   r	   r   &   s    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   s2   | j " | jr$| j |¡ | j  ¡  W 5 Q R X d S r   ©r   r   r   ÚappendÚnotifyr   r   r   r	   r   2   s    zIterableConsumer.consumec              	   C   s&   | j  d| _| j  ¡  W 5 Q R X d S ©NF)r   r   r   r   r   r   r	   r   8   s    zIterableConsumer.terminatec              	   C   s8   | j ( | jr*| j |¡ d| _| j  ¡  W 5 Q R X 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   sR   | j B | jr | js | j  ¡  q| jr>| j d¡W  5 Q R £ S tƒ ‚W 5 Q R X 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
   W   s    
z ThreadSwitchingConsumer.__init__c              
   C   sÖ   z0|t kr| ¡  n|r$| |¡ n
| |¡ W n, tk
r\ } zt |¡ W 5 d }~X Y nX | jf |r~d| _W 5 Q R £ d S | j	r¢| j	 
d¡}| j	 ož| j }n$| js²t }d}nd| _W 5 Q R £ d S W 5 Q R X q d S )NFr   T)Ú	_NO_VALUEr   r   r   Ú	ExceptionÚ_LOGGERÚ	exceptionr(   r+   r   r#   r   )r   r,   r   r   Úer   r   r	   Ú_spina   s(    
zThreadSwitchingConsumer._spinc              	   C   sL   | j < | jr>| jr"| j |¡ n| j | j| j|d¡ d| _W 5 Q R X d S r&   ©	r(   r   r+   r   r   r*   Úsubmitr3   r)   r   r   r   r	   r   {   s    zThreadSwitchingConsumer.consumec              	   C   sD   | j 4 | jr6d| _| js6| j | j| jtd¡ d| _W 5 Q R X d S r&   )r(   r   r+   r*   r5   r3   r)   r.   r   r   r   r	   r   „   s    z!ThreadSwitchingConsumer.terminatec              	   C   sR   | j B | jrDd| _| jr(| j |¡ n| j | j| j|d¡ d| _W 5 Q R X d S r&   r4   r   r   r   r	   r   Œ   s    z-ThreadSwitchingConsumer.consume_and_terminateN)	r   r   r   r   r
   r3   r   r   r   r   r   r   r	   r%   T   s   
	r%   )r   Úloggingr   Zgrpc.framework.foundationr   Úobjectr.   Ú	getLoggerr   r0   ZConsumerr   r   r%   r   r   r   r	   Ú<module>   s   
*