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)ÚselfÚtransformationÚ
downstream© r
   úb/var/www/html/CropPilot/venv/lib/python3.10/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   r0   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.   Úsubmitr7   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.   r9   r7   r-   r2   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*   r8   r   r
   r
   r   r   ‹   s   ùÿ"üz-ThreadSwitchingConsumer.consume_and_terminateN)	r   r   r   r   r   r7   r   r   r   r
   r
   r
   r   r)   S   s    
	r)   )r   Úloggingr   Úgrpc.framework.foundationr   Úobjectr2   Ú	getLoggerr   r4   ÚConsumerr   r   r)   r
   r
   r
   r   Ú<module>   s   
)