U
    M}g                     @  s   d dl mZ d dlmZ ddlmZ dd ZG dd dZG d	d
 d
ZG dd deZ	G dd dZ
dd ZG dd deZdS )    )annotations)repeat   )_missingc                 C  s   t t| jdd S )Nz objects are immutable)	TypeErrortype__name__self r   B/tmp/pip-unpacked-wheel-s46b54kd/werkzeug/datastructures/mixins.pyis_immutable   s    r   c                   @  s   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd ZdddZdd Zd ddZdS )!ImmutableListMixinzOMakes a :class:`list` immutable.

    .. versionadded:: 0.5

    :private:
    Nc                 C  s&   | j d k	r| j S tt|  }| _ |S N)_hash_cachehashtupler
   rvr   r   r   __hash__   s    
zImmutableListMixin.__hash__c                 C  s   t | t| ffS r   )r   listr
   protocolr   r   r   __reduce_ex__   s    z ImmutableListMixin.__reduce_ex__c                 C  s   t |  d S r   r   r
   keyr   r   r   __delitem__   s    zImmutableListMixin.__delitem__c                 C  s   t |  d S r   r   r
   otherr   r   r   __iadd__"   s    zImmutableListMixin.__iadd__c                 C  s   t |  d S r   r   r   r   r   r   __imul__%   s    zImmutableListMixin.__imul__c                 C  s   t |  d S r   r   r
   r   valuer   r   r   __setitem__(   s    zImmutableListMixin.__setitem__c                 C  s   t |  d S r   r   r
   itemr   r   r   append+   s    zImmutableListMixin.appendc                 C  s   t |  d S r   r   r%   r   r   r   remove.   s    zImmutableListMixin.removec                 C  s   t |  d S r   r   )r
   iterabler   r   r   extend1   s    zImmutableListMixin.extendc                 C  s   t |  d S r   r   r
   posr#   r   r   r   insert4   s    zImmutableListMixin.insertc                 C  s   t |  d S r   r   )r
   indexr   r   r   pop7   s    zImmutableListMixin.popc                 C  s   t |  d S r   r   r	   r   r   r   reverse:   s    zImmutableListMixin.reverseFc                 C  s   t |  d S r   r   )r
   r   r1   r   r   r   sort=   s    zImmutableListMixin.sort)r.   )NF)r   
__module____qualname____doc__r   r   r   r   r    r!   r$   r'   r(   r*   r-   r0   r1   r2   r   r   r   r   r      s   
r   c                      s~   e Zd ZdZdZed fdd	Zdd Zdd Zd	d
 Z	dddZ
dd ZdddZdd Zdd Zdd Zdd Z  ZS )ImmutableDictMixinzOMakes a :class:`dict` immutable.

    .. versionadded:: 0.5

    :private:
    Nc                   s$   t  | }|t|t| |S r   )super__new____init__zipr   )clskeysr#   instance	__class__r   r   fromkeysK   s    zImmutableDictMixin.fromkeysc                 C  s   t | t| ffS r   )r   dictr   r   r   r   r   Q   s    z ImmutableDictMixin.__reduce_ex__c                 C  s   |   S r   itemsr	   r   r   r   _iter_hashitemsT   s    z"ImmutableDictMixin._iter_hashitemsc                 C  s*   | j d k	r| j S tt|   }| _ |S r   )r   r   	frozensetrD   r   r   r   r   r   W   s    
zImmutableDictMixin.__hash__c                 C  s   t |  d S r   r   r
   r   defaultr   r   r   
setdefault]   s    zImmutableDictMixin.setdefaultc                 O  s   t |  d S r   r   r
   argskwargsr   r   r   update`   s    zImmutableDictMixin.updatec                 C  s   t |  d S r   r   rF   r   r   r   r0   c   s    zImmutableDictMixin.popc                 C  s   t |  d S r   r   r	   r   r   r   popitemf   s    zImmutableDictMixin.popitemc                 C  s   t |  d S r   r   r"   r   r   r   r$   i   s    zImmutableDictMixin.__setitem__c                 C  s   t |  d S r   r   r   r   r   r   r   l   s    zImmutableDictMixin.__delitem__c                 C  s   t |  d S r   r   r	   r   r   r   clearo   s    zImmutableDictMixin.clear)N)N)N)r   r3   r4   r5   r   classmethodr@   r   rD   r   rH   rL   r0   rM   r$   r   rN   __classcell__r   r   r>   r   r6   A   s   

r6   c                   @  sJ   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dddZ
dS )ImmutableMultiDictMixinzTMakes a :class:`MultiDict` immutable.

    .. versionadded:: 0.5

    :private:
    c                 C  s   t | t| jddffS NT)Zmulti)r   r   rC   r   r   r   r   r   {   s    z%ImmutableMultiDictMixin.__reduce_ex__c                 C  s   | j ddS rR   rB   r	   r   r   r   rD   ~   s    z'ImmutableMultiDictMixin._iter_hashitemsc                 C  s   t |  d S r   r   r"   r   r   r   add   s    zImmutableMultiDictMixin.addc                 C  s   t |  d S r   r   r	   r   r   r   popitemlist   s    z#ImmutableMultiDictMixin.popitemlistc                 C  s   t |  d S r   r   r   r   r   r   poplist   s    zImmutableMultiDictMixin.poplistc                 C  s   t |  d S r   r   )r
   r   Znew_listr   r   r   setlist   s    zImmutableMultiDictMixin.setlistNc                 C  s   t |  d S r   r   )r
   r   Zdefault_listr   r   r   setlistdefault   s    z&ImmutableMultiDictMixin.setlistdefault)N)r   r3   r4   r5   r   rD   rS   rT   rU   rV   rW   r   r   r   r   rQ   s   s   rQ   c                   @  s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdefddZdd Zdd Zdd ZdS )ImmutableHeadersMixinzMakes a :class:`Headers` immutable.  We do not mark them as
    hashable though since the only usecase for this datastructure
    in Werkzeug is a view on a mutable structure.

    .. versionadded:: 0.5

    :private:
    c                 K  s   t |  d S r   r   )r
   r   rK   r   r   r   r      s    z!ImmutableHeadersMixin.__delitem__c                 C  s   t |  d S r   r   r"   r   r   r   r$      s    z!ImmutableHeadersMixin.__setitem__c                 K  s   t |  d S r   r   r
   _key_valuerK   r   r   r   set   s    zImmutableHeadersMixin.setc                 C  s   t |  d S r   r   )r
   r   valuesr   r   r   rV      s    zImmutableHeadersMixin.setlistc                 K  s   t |  d S r   r   rY   r   r   r   rS      s    zImmutableHeadersMixin.addc                 K  s   t |  d S r   r   )r
   rZ   r[   _kwargsr   r   r   
add_header   s    z ImmutableHeadersMixin.add_headerc                 C  s   t |  d S r   r   r   r   r   r   r(      s    zImmutableHeadersMixin.removec                 O  s   t |  d S r   r   rI   r   r   r   r*      s    zImmutableHeadersMixin.extendc                 O  s   t |  d S r   r   rI   r   r   r   rL      s    zImmutableHeadersMixin.updatec                 C  s   t |  d S r   r   r+   r   r   r   r-      s    zImmutableHeadersMixin.insertNc                 C  s   t |  d S r   r   rF   r   r   r   r0      s    zImmutableHeadersMixin.popc                 C  s   t |  d S r   r   r	   r   r   r   rM      s    zImmutableHeadersMixin.popitemc                 C  s   t |  d S r   r   rF   r   r   r   rH      s    z ImmutableHeadersMixin.setdefaultc                 C  s   t |  d S r   r   rF   r   r   r   rW      s    z$ImmutableHeadersMixin.setlistdefault)r   r3   r4   r5   r   r$   r\   rV   rS   r_   r(   r*   rL   r-   r   r0   rM   rH   rW   r   r   r   r   rX      s   	rX   c                   s    fdd} |_ |S )Nc                   s.   t tt|  ||}| jd k	r*| |  |S r   )getattrr7   UpdateDictMixin	on_update)r
   rJ   kwr   namer   r   oncall   s    

z_calls_update.<locals>.oncall)r   )re   rf   r   rd   r   _calls_update   s    rg   c                      s^   e Zd ZdZdZd fdd	Zef fdd	ZedZ	edZ
ed	Zed
ZedZ  ZS )ra   zbMakes dicts call `self.on_update` on modifications.

    .. versionadded:: 0.5

    :private:
    Nc                   s2   || k}t  ||}|r.| jd k	r.| |  |S r   )r7   rH   rb   r
   r   rG   modifiedr   r>   r   r   rH      s
    
zUpdateDictMixin.setdefaultc                   sH   || k}|t krt |}nt ||}|rD| jd k	rD| |  |S r   )r   r7   r0   rb   rh   r>   r   r   r0      s    
zUpdateDictMixin.popr$   r   rN   rM   rL   )N)r   r3   r4   r5   rb   rH   r   r0   rg   r$   r   rN   rM   rL   rP   r   r   r>   r   ra      s   
ra   N)
__future__r   	itertoolsr   	_internalr   r   r   r6   rQ   rX   rg   rA   ra   r   r   r   r   <module>   s   525