o
    Dfp                     @  s   d Z ddlmZ ddlmZ ddlmZ dZddd	d
ZG dd dZ	G dd dZ
G dd de
ZG dd deZdd ZdS )zScheduling Utilities.    )annotations)count   )symbol_by_name)	FairCyclepriority_cycleround_robin_cyclesorted_cyclez%kombu.utils.scheduling:priority_cyclez(kombu.utils.scheduling:round_robin_cyclez#kombu.utils.scheduling:sorted_cycle)priorityround_robinsortedc                   @  s<   e Zd ZdZefddZdd Zdd Zdd	 Zd
d Z	dS )r   a2  Cycle between resources.

    Consume from a set of resources, where each resource gets
    an equal chance to be consumed from.

    Arguments:
    ---------
        fun (Callable): Callback to call.
        resources (Sequence[Any]): List of resources.
        predicate (type): Exception predicate.
    c                 C  s   || _ || _|| _d| _d S )Nr   )fun	resources	predicatepos)selfr   r   r    r   O/home/ubuntu/webapp/venv/lib/python3.10/site-packages/kombu/utils/scheduling.py__init__!   s   
zFairCycle.__init__c                 C  sL   	 z| j | j }|  jd7  _|W S  ty$   d| _| j s"|  Y nw q)Nr   r   )r   r   
IndexErrorr   )r   resourcer   r   r   _next'   s   zFairCycle._nextc              	   K  s\   t dD ]'}|  }z| j||fi |W   S  | jy+   |t| jd kr) Y qw dS )zGet from next resource.r   r   N)r   r   r   r   lenr   )r   callbackkwargstriedr   r   r   r   get2   s   zFairCycle.getc                 C     dS )zClose cycle.Nr   r   r   r   r   close=       zFairCycle.closec                 C  s   dj | t| jdS )z``repr(cycle)``.z/<FairCycle: {self.pos}/{size} {self.resources}>)r   size)formatr   r   r   r   r   r   __repr__@   s   
zFairCycle.__repr__N)
__name__
__module____qualname____doc__	Exceptionr   r   r   r   r#   r   r   r   r   r      s    r   c                   @  s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )r   z2Iterator that cycles between items in round-robin.Nc                 C  s   |d ur	|| _ d S g | _ d S Nitemsr   itr   r   r   r   I   s   zround_robin_cycle.__init__c                 C  s   || j dd< dS )zUpdate items from iterable.Nr*   r,   r   r   r   updateL      zround_robin_cycle.updatec                 C  s   | j d| S zConsume n items.Nr*   r   nr   r   r   consumeP   s   zround_robin_cycle.consumec                 C  s8   | j }z|||| W |S  ty   Y |S w )z,Move most recently used item to end of list.)r+   appendpopindex
ValueError)r   	last_usedr+   r   r   r   rotateT   s   zround_robin_cycle.rotater)   )r$   r%   r&   r'   r   r.   r3   r9   r   r   r   r   r   F   s    
r   c                   @     e Zd ZdZdd ZdS )r   z"Cycle that repeats items in order.c                 C  r   )zUnused in this implementation.Nr   )r   r8   r   r   r   r9   a   r    zpriority_cycle.rotateN)r$   r%   r&   r'   r9   r   r   r   r   r   ^       r   c                   @  r:   )r	   zCycle in sorted order.c                 C  s   t | jd| S r0   )r   r+   r1   r   r   r   r3   h   r/   zsorted_cycle.consumeN)r$   r%   r&   r'   r3   r   r   r   r   r	   e   r;   r	   c                 C  s
   t | tS )zGet cycle class by name.)r   CYCLE_ALIASES)namer   r   r   cycle_by_namem   s   
r>   N)r'   
__future__r   	itertoolsr   importsr   __all__r<   r   r   r   r	   r>   r   r   r   r   <module>   s    2