
    "d                    x    d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZ  ed      Z G d de	e         Zy)    )annotationsN)deque)CallableDequeGenericOptionalTupleTypeVarTc                  2    e Zd Zd ZdddZd Zd	dZd
dZy)DelayedQueuec                    || _         t        j                         | _        t        j                  | j                        | _        t               | _        d| _        y )NF)		delay_sec	threadingLock_lock	Condition
_not_emptyr   _queue_closed)selfdelays     >/usr/lib/python3/dist-packages/watchdog/utils/delayed_queue.py__init__zDelayedQueue.__init__   s=    ^^%
#--djj949G    c                    | j                   j                          | j                  j                  |t	        j                         |f       | j
                  j                          | j                   j                          y)zAdd element to queue.N)r   acquirer   appendtimer   notifyrelease)r   elementr   s      r   putzDelayedQueue.put!   sQ    

GTYY[%89 

r   c                    d| _         | j                  j                          | j                  j                          | j                  j	                          y)z4Close queue, indicating no more items will be added.TN)r   r   r   r    r!   )r   s    r   closezDelayedQueue.close(   s9    ! !r   c                b   	 | j                   j                          t        | j                        dk(  rK| j                  s?| j                   j                          t        | j                        dk(  r| j                  s?| j                  r| j                   j                          y| j                  d   \  }}}| j                   j                          |rh|| j                  z   t        j                         z
  }|dkD  r?t        j                  |       || j                  z   t        j                         z
  }|dkD  r?| j                  5  t        | j                        dkD  r9| j                  d   d   |u r%| j                  j                          |cddd       S ddd       # 1 sw Y   xY w)zwRemove and return an element from the queue, or this queue has been
        closed raise the Closed exception.
        r   N)r   r   lenr   r   waitr!   r   r   sleepr   popleft)r   headinsert_timer   	time_lefts        r   getzDelayedQueue.get0   sO    OO##%dkk"a'$$& dkk"a' ||'')'+{{1~$D+uOO##% '$..8499;F	!mJJy) +dnn <tyy{ JI  !m
   t{{#a'DKKN1,=,EKK'')     ) (   s   	AF%%F.c                    | j                   5  t        | j                        D ]+  \  }\  }}} ||      s| j                  |= |c cddd       S  	 ddd       y# 1 sw Y   yxY w)zVRemove and return the first items for which predicate is True,
        ignoring delay.N)r   	enumerater   )r   	predicateielemtr   s         r   removezDelayedQueue.removeM   sj     ZZ 	 '0'=  ##D!UT?AK		  	  	 
 	 
 s   (AAAA$N)F)r"   r   r   boolreturnNone)r7   Optional[T])r1   zCallable[[T], bool]r7   r9   )__name__
__module____qualname__r   r#   r%   r.   r5    r   r   r   r      s    " :r   r   )
__future__r   r   r   collectionsr   typingr   r   r   r   r	   r
   r   r   r=   r   r   <module>rA      s2    #    E ECL<71: <r   