U
    4Je                     @   s   d dl Z d dlZd dlmZmZ d dlmZmZ d dlm	Z	 d dl
m
Z
 dd Zdd	 ZG d
d deZe
ddG dd deZdS )    N)OrderedDictdeque)MutableMappingSequence)Optional)
deprecatedc                 C   s   t j | d }|dS )z*Get an ISO 8601 string from time_ns value.g    eAz%Y-%m-%dT%H:%M:%S.%fZ)datetimeutcfromtimestampstrftime)Znanosecondsts r   I/tmp/pip-unpacked-wheel-7_167w8m/mysql/opentelemetry/sdk/util/__init__.pyns_to_iso_str   s    r   c                 C   s   t ttdd |  S )z*Converts a dict to be used as a unique keyc                 S   s&   t | d tr"| d t| d fS | S )N   r   )
isinstancelisttuple)kvr   r   r   <lambda>$       z!get_dict_as_key.<locals>.<lambda>)r   sortedmapitems)labelsr   r   r   get_dict_as_key   s    r   c                   @   s^   e Zd ZdZee dddZdd Zdd Zd	d
 Z	dd Z
dd Zdd Zedd ZdS )BoundedListzAn append only list with a fixed max size.

    Calls to `append` and `extend` will drop the oldest elements if there is
    not enough room.
    maxlenc                 C   s    d| _ t|d| _t | _d S )Nr   r   )droppedr   _dq	threadingLock_lockselfr   r   r   r   __init__2   s    zBoundedList.__init__c                 C   s&   t | j dt| j d| jj dS N(z	, maxlen=))type__name__r   r   r   r$   r   r   r   __repr__7   s    zBoundedList.__repr__c                 C   s
   | j | S N)r   )r$   indexr   r   r   __getitem__:   s    zBoundedList.__getitem__c                 C   s
   t | jS r-   )lenr   r+   r   r   r   __len__=   s    zBoundedList.__len__c              
   C   s,   | j  tt| jW  5 Q R  S Q R X d S r-   )r"   iterr   r   r+   r   r   r   __iter__@   s    zBoundedList.__iter__c              	   C   sN   | j > | jjd k	r4t| j| jjkr4|  jd7  _| j| W 5 Q R X d S )Nr   )r"   r   r   r0   r   append)r$   itemr   r   r   r4   D   s    zBoundedList.appendc              	   C   s^   | j N | jjd k	rDt|t| j | jj }|dkrD|  j|7  _| j| W 5 Q R X d S Nr   )r"   r   r   r0   r   extend)r$   seqZto_dropr   r   r   r7   J   s    zBoundedList.extendc                 C   s   t |}| |}|| |S r-   )r   r7   )clsr   r8   Zbounded_listr   r   r   from_seqR   s    
zBoundedList.from_seqN)r*   
__module____qualname____doc__r   intr%   r,   r/   r1   r3   r4   r7   classmethodr:   r   r   r   r   r   +   s   r   z1.4.0)versionc                   @   s^   e Zd ZdZee dddZdd Zdd Zd	d
 Z	dd Z
dd Zdd Zedd ZdS )BoundedDictzAn ordered dict with a fixed max capacity.

    Oldest elements are dropped when the dict is full and a new element is
    added.
    r   c                 C   sD   |d k	r"t |tst|dk r"t|| _d| _t | _t | _	d S r6   )
r   r>   
ValueErrorr   r   r   _dictr    r!   r"   r#   r   r   r   r%   b   s    
zBoundedDict.__init__c                 C   s$   t | j dt| j d| j dS r&   )r)   r*   dictrC   r   r+   r   r   r   r,   m   s    zBoundedDict.__repr__c                 C   s
   | j | S r-   rC   r$   keyr   r   r   r/   p   s    zBoundedDict.__getitem__c              	   C   s   | j  | jd k	r8| jdkr8|  jd7  _W 5 Q R  d S || jkrL| j|= n>| jd k	rt| j| jkr| jtt| j = |  jd7  _|| j|< W 5 Q R X d S )Nr   r   )r"   r   r   rC   r0   nextr2   keys)r$   rG   valuer   r   r   __setitem__s   s    

zBoundedDict.__setitem__c                 C   s   | j |= d S r-   rE   rF   r   r   r   __delitem__   s    zBoundedDict.__delitem__c              
   C   s,   | j  t| j W  5 Q R  S Q R X d S r-   )r"   r2   rC   copyr+   r   r   r   r3      s    zBoundedDict.__iter__c                 C   s
   t | jS r-   )r0   rC   r+   r   r   r   r1      s    zBoundedDict.__len__c                 C   s.   t |}| |}| D ]\}}|||< q|S r-   )r   r   )r9   r   mappingZbounded_dictrG   rJ   r   r   r   from_map   s
    
zBoundedDict.from_mapN)r*   r;   r<   r=   r   r>   r%   r,   r/   rK   rL   r3   r1   r?   rO   r   r   r   r   rA   Z   s   rA   )r   r    collectionsr   r   collections.abcr   r   typingr   r   r   r   r   rA   r   r   r   r   <module>   s   /