
    Tg%e)
                     X    d dl mZ d dlmZmZmZmZmZmZ d dl	m
Z
  G d d          ZdS )    )deque)AnyCallableHashableIterableListOptional)	BaseQueuec                       e Zd ZdZddeegef         dee         ddfdZde	d	eddfd
Z
dee	         fdZdee	         fdZdee         fdZdefdZdS )RoundRobinQueuea1  A round robin queue implemented using multiple internal queues (typically,
    FIFO queues). The internal queue must implement the following methods:
        * push(obj)
        * pop()
        * peek()
        * close()
        * __len__()
    The constructor receives a qfactory argument, which is a callable used to
    instantiate a new (internal) queue when a new key is allocated. The
    qfactory function is called with the key number as first and only argument.
    start_domains is a sequence of domains to initialize the queue with. If the
    queue was previously closed leaving some domain buckets non-empty, those
    domains should be passed in start_domains.

    The queue maintains a fifo queue of keys. The key that went last is popped
    first and the next queue for that key is then popped.
     qfactorystart_domainsreturnNc                     i | _         || _        |D ]}|                     |          | j         |<    t          |          | _        d S N)queuesr   r   	key_queue)selfr   r   keys       0lib/python3.11/site-packages/queuelib/rrqueue.py__init__zRoundRobinQueue.__init__   sM       	2 	2C#}}S11DK}--    objr   c                     || j         vr7|                     |          | j        |<   | j                             |           | j        |         }|                    |           d S r   )r   r   r   
appendleftpush)r   r   r   qs       r   r   zRoundRobinQueue.push!   s\    dn$$#}}S11DKN%%c***K	sr   c                     	 | j         d         }n# t          $ r Y d S w xY w| j        |                                         S )N)r   
IndexErrorr   peek)r   r   s     r   r"   zRoundRobinQueue.peek(   sP    	.$CC 	 	 	44	{3$$&&&s    
c                 <   	 	 | j                                         }n# t          $ r Y d S w xY w| j        |         }|                                }t	          |          dk    r| j        |= |                                 n| j                             |           |r|S )NTr   )r   popr!   r   lencloser   )r   r   r   ms       r   r$   zRoundRobinQueue.pop/   s    	n((**   tt C AA1vv{{K$				))#... !	s    
++c                     g }| j                                         D ]=\  }}t          |          r|                    |           |                                 >|S r   )r   itemsr%   appendr&   )r   activekr   s       r   r&   zRoundRobinQueue.closeC   s\    K%%'' 	 	DAq1vv !a   GGIIIIr   c                 t    | j         r0t          d | j                                         D                       ndS )Nc              3   4   K   | ]}t          |          V  d S r   )r%   ).0xs     r   	<genexpr>z*RoundRobinQueue.__len__.<locals>.<genexpr>L   s(      88a3q66888888r   r   )r   sumvalues)r   s    r   __len__zRoundRobinQueue.__len__K   s9    <@KNs884;#5#5#7#7888888QNr   )r   )__name__
__module____qualname____doc__r   r   r
   r   r   r   r   r	   r"   r$   r   r&   intr4   r   r   r   r   r      s        $. .8*i*?!@ .QYZbQc .mq . . . . ( t    'hsm ' ' ' 'Xc]    (tH~    O O O O O O Or   r   N)collectionsr   typingr   r   r   r   r   r	   queuelib.queuer
   r   r   r   r   <module>r=      s          D D D D D D D D D D D D D D D D $ $ $ $ $ $EO EO EO EO EO EO EO EO EO EOr   