o
    9e                     @  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)Nz objects are immutable)	TypeErrortype__name__self r   >lib/python3.10/site-packages/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 ur| j S tt|  }| _ |S N)_hash_cachehashtupler
   rvr   r   r   __hash__   s   
zImmutableListMixin.__hash__c                 C     t | t| ffS r   )r   listr
   Zprotocolr   r   r   __reduce_ex__      z ImmutableListMixin.__reduce_ex__c                 C     t |  d S r   r   r
   keyr   r   r   __delitem__      zImmutableListMixin.__delitem__c                 C  r   r   r   r
   otherr   r   r   __iadd__"   r    zImmutableListMixin.__iadd__c                 C  r   r   r   r!   r   r   r   __imul__%   r    zImmutableListMixin.__imul__c                 C  r   r   r   r
   r   valuer   r   r   __setitem__(   r    zImmutableListMixin.__setitem__c                 C  r   r   r   r
   itemr   r   r   append+   r    zImmutableListMixin.appendc                 C  r   r   r   r(   r   r   r   remove.   r    zImmutableListMixin.removec                 C  r   r   r   )r
   iterabler   r   r   extend1   r    zImmutableListMixin.extendc                 C  r   r   r   r
   posr&   r   r   r   insert4   r    zImmutableListMixin.insertc                 C  r   r   r   )r
   indexr   r   r   pop7   r    zImmutableListMixin.popc                 C  r   r   r   r	   r   r   r   reverse:   r    zImmutableListMixin.reverseFc                 C  r   r   r   )r
   r   r4   r   r   r   sort=   r    zImmutableListMixin.sort)r1   )NF)r   
__module____qualname____doc__r   r   r   r   r#   r$   r'   r*   r+   r-   r0   r3   r4   r5   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  r   r   )r   dictr   r   r   r   r   Q   r   z ImmutableDictMixin.__reduce_ex__c                 C  s   |   S r   itemsr	   r   r   r   _iter_hashitemsT   s   z"ImmutableDictMixin._iter_hashitemsc                 C  s*   | j d ur| j S tt|   }| _ |S r   )r   r   	frozensetrG   r   r   r   r   r   W   s   
zImmutableDictMixin.__hash__c                 C  r   r   r   r
   r   defaultr   r   r   
setdefault]   r    zImmutableDictMixin.setdefaultc                 O  r   r   r   r
   argskwargsr   r   r   update`   r    zImmutableDictMixin.updatec                 C  r   r   r   rI   r   r   r   r3   c   r    zImmutableDictMixin.popc                 C  r   r   r   r	   r   r   r   popitemf   r    zImmutableDictMixin.popitemc                 C  r   r   r   r%   r   r   r   r'   i   r    zImmutableDictMixin.__setitem__c                 C  r   r   r   r   r   r   r   r   l   r    zImmutableDictMixin.__delitem__c                 C  r   r   r   r	   r   r   r   clearo   r    zImmutableDictMixin.clearr   )r   r6   r7   r8   r   classmethodrC   r   rG   r   rK   rO   r3   rP   r'   r   rQ   __classcell__r   r   rA   r   r9   A   s    

r9   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   rF   r   r   r   r   r   {   s   z%ImmutableMultiDictMixin.__reduce_ex__c                 C  s   | j ddS rU   rE   r	   r   r   r   rG   ~   r    z'ImmutableMultiDictMixin._iter_hashitemsc                 C  r   r   r   r%   r   r   r   add   r    zImmutableMultiDictMixin.addc                 C  r   r   r   r	   r   r   r   popitemlist   r    z#ImmutableMultiDictMixin.popitemlistc                 C  r   r   r   r   r   r   r   poplist   r    zImmutableMultiDictMixin.poplistc                 C  r   r   r   )r
   r   Znew_listr   r   r   setlist   r    zImmutableMultiDictMixin.setlistNc                 C  r   r   r   )r
   r   Zdefault_listr   r   r   setlistdefault   r    z&ImmutableMultiDictMixin.setlistdefaultr   )r   r6   r7   r8   r   rG   rV   rW   rX   rY   rZ   r   r   r   r   rT   s   s    rT   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  r   r   r   )r
   r   rN   r   r   r   r      r    z!ImmutableHeadersMixin.__delitem__c                 C  r   r   r   r%   r   r   r   r'      r    z!ImmutableHeadersMixin.__setitem__c                 K  r   r   r   r
   _key_valuerN   r   r   r   set   r    zImmutableHeadersMixin.setc                 C  r   r   r   )r
   r   valuesr   r   r   rY      r    zImmutableHeadersMixin.setlistc                 K  r   r   r   r\   r   r   r   rV      r    zImmutableHeadersMixin.addc                 K  r   r   r   )r
   r]   r^   Z_kwargsr   r   r   
add_header   r    z ImmutableHeadersMixin.add_headerc                 C  r   r   r   r   r   r   r   r+      r    zImmutableHeadersMixin.removec                 O  r   r   r   rL   r   r   r   r-      r    zImmutableHeadersMixin.extendc                 O  r   r   r   rL   r   r   r   rO      r    zImmutableHeadersMixin.updatec                 C  r   r   r   r.   r   r   r   r0      r    zImmutableHeadersMixin.insertNc                 C  r   r   r   rI   r   r   r   r3      r    zImmutableHeadersMixin.popc                 C  r   r   r   r	   r   r   r   rP      r    zImmutableHeadersMixin.popitemc                 C  r   r   r   rI   r   r   r   rK      r    z ImmutableHeadersMixin.setdefaultc                 C  r   r   r   rI   r   r   r   rZ      r    z$ImmutableHeadersMixin.setlistdefault)r   r6   r7   r8   r   r'   r_   rY   rV   ra   r+   r-   rO   r0   r   r3   rP   rK   rZ   r   r   r   r   r[      s     	r[   c                   s    fdd} |_ |S )Nc                   s2   t tt|  |i |}| jd ur| |  |S r   )getattrr:   UpdateDictMixin	on_update)r
   rM   kwr   namer   r   oncall   s   

z_calls_update.<locals>.oncall)r   )rg   rh   r   rf   r   _calls_update   s   ri   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 )rc   zbMakes dicts call `self.on_update` on modifications.

    .. versionadded:: 0.5

    :private:
    Nc                   s2   || v}t  ||}|r| jd ur| |  |S r   )r:   rK   rd   r
   r   rJ   Zmodifiedr   rA   r   r   rK      s
   
zUpdateDictMixin.setdefaultc                   sH   || v }|t u rt |}nt ||}|r"| jd ur"| |  |S r   )r   r:   r3   rd   rj   rA   r   r   r3      s   
zUpdateDictMixin.popr'   r   rQ   rP   rO   r   )r   r6   r7   r8   rd   rK   r   r3   ri   r'   r   rQ   rP   rO   rS   r   r   rA   r   rc      s    
rc   N)Z
__future__r   	itertoolsr   Z	_internalr   r   r   r9   rT   r[   ri   rD   rc   r   r   r   r   <module>   s    525