<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
uAc^                 @   sl   d Z ddlZddlmZ ddgZG dd deZG dd	 d	eZG d
d deeeZ	G dd de
e	ZdS )z[This module contains variants of certain base types which call registered
hooks on changes.    N)with_metaclassHookableHookableSetc               @   s    e Zd Zdd Zedd ZdS )HookableTypec             C   s   d|kry|d }W nJ t k
r^   d }x0dd |D D ]}|rRtdt| q8|}q8W Y nX x |d D ]}tj||||< qjW tj| |||S )N_hookable_change_methodsZ_hookable_base_classc             s   s   | ]}|t kr|V  qd S )N)r   ).0x r	   /usr/lib/python3.6/hookable.py	<genexpr>)   s    z'HookableType.__new__.<locals>.<genexpr>ztoo many base classes: %s)KeyError	TypeErrorstrr   wrap_methodtype__new__)clsnamebasesZdctbaseZbase_candidate
methodnamer	   r	   r
   r   "   s    zHookableType.__new__c                s    t ||  fdd}||_|S )Nc                s    | f||}| j   |S )N)
_run_hooks)selfpkZretval)funcr	   r
   methodwrapper9   s    z/HookableType.wrap_method.<locals>.methodwrapper)getattr__name__)r   r   r   r   r	   )r   r
   r   5   s    
zHookableType.wrap_methodN)r   
__module____qualname__r   classmethodr   r	   r	   r	   r
   r       s   r   c               @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )
_HookEntryNc             C   s   t |tjstt |tstxFt|D ]:\}}yt| W q( tk
r`   td||f Y q(X q(W xF|j D ]:\}}yt| W qp tk
r   td||f Y qpX qpW t |t	st	|}|| _
|| _|| _|| _d | _d S )Nz*Positional argument %d is not hashable: %rz'Keyword argument %r is not hashable: %r)
isinstancecollectionsCallableAssertionErrorr   	enumeratehashr   itemstuple_HookEntry__hook_HookEntry__args_HookEntry__kwargs_HookEntry__hookable_HookEntry__hash)r   hookargskwargshookablenr   r   r	   r	   r
   __init__D   s.    
z_HookEntry.__init__c             C   s$   | j |j ko"| j|jko"| j|jkS )N)r+   r,   r-   )r   objr	   r	   r
   __cmp__c   s    z_HookEntry.__cmp__c             C   s   | j s| j | _ | j S )N)r/   _compute_hash)r   r	   r	   r
   __hash__i   s    
z_HookEntry.__hash__c             C   s>   t | j}t |t | jA }t |t tt| jj A }|S )N)r(   r+   r,   r*   sortedr-   r)   )r   	hashvaluer	   r	   r
   r8   n   s
    
z_HookEntry._compute_hashc             C   s4   | j r | j| j f| j| j n| j| j| j d S )N)r.   r+   r,   r-   )r   r	   r	   r
   runu   s    z_HookEntry.run)N)r   r   r    r5   r7   r9   r8   r<   r	   r	   r	   r
   r"   B   s
   
r"   c               @   s   e Zd ZdZedd Zdd Zdd ZeeeZdd	 Z	d
d Z
ee	e
Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )r   z2An object which calls registered hooks on changes.c             O   s   t | dst | _| jS )N__real_hooks__)hasattrsetr=   )r   r   r   r	   r	   r
   	__hooks__   s    
zHookable.__hooks__c             C   s   t | dsd| _| jS )N__hooks_enabled__T)r>   rA   )r   r	   r	   r
   _get_hooks_enabled   s    
zHookable._get_hooks_enabledc             C   s
   || _ d S )N)rA   )r   Zenabledr	   r	   r
   _set_hooks_enabled   s    zHookable._set_hooks_enabledc             C   s   t | dsd| _| jS )N__hooks_frozen__F)r>   rD   )r   r	   r	   r
   _get_hooks_frozen   s    
zHookable._get_hooks_frozenc             C   sB   || j krd S || _|r"t | _nx| jD ]}|j  q*W | `d S )N)hooks_frozenrD   r?   __hooks_frozen_entries__r<   )r   Zfreeze	hookentryr	   r	   r
   _set_hooks_frozen   s    

zHookable._set_hooks_frozenc             C   s
   d| _ d S )NT)rF   )r   r	   r	   r
   freeze_hooks   s    zHookable.freeze_hooksc             C   s
   d| _ d S )NF)rF   )r   r	   r	   r
   
thaw_hooks   s    zHookable.thaw_hooksc             O   s   | j |d f|| d S )N)_Hookable__add_hook)r   r0   r1   r2   r	   r	   r
   add_hook   s    zHookable.add_hookc             O   s   | j || f|| d S )N)rL   )r   r0   r1   r2   r	   r	   r
   add_hook_hookable   s    zHookable.add_hook_hookablec             O   s>   t |tjstt |tstt||||d}| jj| d S )N)r3   )r#   r$   r%   r&   r   r"   r@   add)r   r0   Z	_hookabler1   r2   rH   r	   r	   r
   Z
__add_hook   s    zHookable.__add_hookc             O   s   | j jt||| d S )N)r@   remover"   )r   r0   r1   r2   r	   r	   r
   remove_hook   s    zHookable.remove_hookc             C   s8   | j r4| js&x&| jD ]}|j  qW n| jj| j d S )N)hooks_enabledrF   r@   r<   rG   update)r   rH   r	   r	   r
   r      s
    zHookable._run_hooksN)r   r   r    __doc__propertyr@   rB   rC   rR   rE   rI   rF   rJ   rK   rM   rN   rL   rQ   r   r	   r	   r	   r
   r   |   s   

c            	   @   s   e Zd ZdZdZdd ZdS )r   z5A set object which calls registered hooks on changes.rO   cleardifference_updatediscardintersection_updatepoprP   symmetric_difference_updaterS   c             C   s   t j| }t  |_|S )N)r?   copyr=   )r   r6   r	   r	   r
   r\      s    
zHookableSet.copyN)	rO   rV   rW   rX   rY   rZ   rP   r[   rS   )r   r   r    rT   r   r\   r	   r	   r	   r
   r      s    )rT   r$   Zsixr   __all__r   r   objectr"   r   r?   r   r	   r	   r	   r
   <module>   s   ":G