o
    .jP                     @  s>   d dl mZ d dlZd dlmZ ddlmZ G dd dZdS )    )annotationsN)deque   )Eventc                   @  s   e Zd ZdZdZd(ddZd)dd	Zd*ddZed+ddZ	ed)ddZ
d,ddZd-ddZd,ddZd.d/d d!Z		d0d1d$d%Z		d0d2d&d'ZdS )3StreamMatrixz5Efficient way to store events for concurrent streams.)_matrix_count_event_cursor_id_stream_countreturnNonec                 C  s   i | _ d| _d| _d| _d S Nr   )r   r   r
   r	   self r   `/home/thesage/.local/lib/python3.10/site-packages/urllib3_future/contrib/hface/_stream_matrix.py__init__   s   
zStreamMatrix.__init__intc                 C     | j S Nr   r   r   r   r   __len__   s   zStreamMatrix.__len__boolc                 C  s
   | j dkS r   r   r   r   r   r   __bool__   s   
zStreamMatrix.__bool__	list[int]c                 C  s   t dd | jD S )Nc                 s  s    | ]	}|d ur|V  qd S r   r   ).0ir   r   r   	<genexpr>!   s    z'StreamMatrix.streams.<locals>.<genexpr>)sortedr   r   r   r   r   streams   s   zStreamMatrix.streamsc                 C  r   r   )r
   r   r   r   r   stream_count#   s   zStreamMatrix.stream_counteventr   c                 C  p   t |dd }| j|_|  jd7  _|| jvr't | j|< |d ur'|  jd7  _| j| | |  jd7  _d S N	stream_idr   )getattrr	   _idr   r   r
   appendr   r   r!   
matrix_idxr   r   r   r'   '   s   
zStreamMatrix.appendeventstyping.Iterable[Event]c                 C  s   i }|D ])}t |dd }| j|_|  jd7  _|  jd7  _||vr&g ||< || | q| D ]"\}}|| jvrLt | j|< |d urL|  jd7  _| j| 	| q2d S r#   )
r%   r	   r&   r   r'   itemsr   r   r
   extend)r   r*   triaged_eventsr!   r)   kvr   r   r   r-   6   s    
zStreamMatrix.extendc                 C  r"   r#   )r%   r	   r&   r   r   r
   
appendleftr   r(   r   r   r   r1   N   s   
zStreamMatrix.appendleftNr$   
int | NoneEvent | Nonec                 C  s  | j dkrd S d | jv ot| jd  }|st| jnt| jdk}|d u r8|r8| j }t|}|d u r8t|}|d urV|rV|| jv rV| jd  d j| j| d jk rVd }n	|r_|| jvr_d }|| jvrfd S | j|  }|d ur|  j d8  _ |d ur| j| s| j|= |  jd8  _|S )Nr   r   )	r   r   r   len__iter__nextr&   popleftr
   )r   r$   have_global_eventany_stream_eventmatrix_dict_iterevr   r   r   r7   \   s6   


 
zStreamMatrix.popleft
excl_eventtuple[type[Event], ...] | Nonec                   sp   |d u r| j S |dkrd | jvrdS t| jd  S || jvr dS t d u r+| j| S  fdd| j| D S )Nr   c                   s   g | ]	}t | s|qS r   
isinstancer   er<   r   r   
<listcomp>   s    z&StreamMatrix.count.<locals>.<listcomp>)r   r   r4   r   r$   r<   r   rC   r   count   s   
zStreamMatrix.countc                   sR   |d u r	| j dkS || jvrdS  d ur"t fdd| j| D S t| j| S )Nr   Fc                 3  s    | ]
}t | s|V  qd S r   r?   rA   rC   r   r   r      s    

z#StreamMatrix.has.<locals>.<genexpr>)r   r   anyr   rE   r   rC   r   has   s   

zStreamMatrix.has)r   r   )r   r   )r   r   )r   r   )r!   r   r   r   )r*   r+   r   r   r   )r$   r2   r   r3   )NN)r$   r2   r<   r=   r   r   )r$   r2   r<   r=   r   r   )__name__
__module____qualname____doc__	__slots__r   r   r   propertyr   r    r'   r-   r1   r7   rF   rH   r   r   r   r   r   	   s(    





+r   )
__future__r   typingcollectionsr   r*   r   r   r   r   r   r   <module>   s
    