3 ˆuAc^ã@sldZddlZddlmZddgZGdd„deƒZGdd „d eƒZGd d„deeeƒƒZ Gd d„de e ƒZ dS) z[This module contains variants of certain base types which call registered hooks on changes.éN)Úwith_metaclassÚHookableÚ HookableSetc@s eZdZdd„Zedd„ƒZdS)Ú HookableTypec Cs’d|kr‚y |d}WnJtk r^d}x0dd„|DƒD]}|rRtdt|ƒƒ‚q8|}q8WYnXx |dD]}tj||ƒ||<qjWtj||||ƒS)NÚ_hookable_change_methodsZ_hookable_base_classcss|]}|tkr|VqdS)N)r)Ú.0Úx©r ú/usr/lib/python3.6/hookable.pyú )sz'HookableType.__new__..ztoo many base classes: %s)ÚKeyErrorÚ TypeErrorÚstrrÚ wrap_methodÚtypeÚ__new__)ÚclsÚnameÚbasesZdctÚbaseZbase_candidateÚ methodnamer r r r"s zHookableType.__new__cs t||ƒ‰‡fdd„}||_|S)Ncsˆ|f|ž|Ž}|jƒ|S)N)Ú _run_hooks)ÚselfÚpÚkZretval)Úfuncr r Ú methodwrapper9sz/HookableType.wrap_method..methodwrapper)ÚgetattrÚ__name__)rrrrr )rr r5s  zHookableType.wrap_methodN)rÚ __module__Ú __qualname__rÚ classmethodrr r r r r src@s6eZdZd dd„Zdd„Zdd„Zdd „Zd d „ZdS) Ú _HookEntryNc CsÄxFt|ƒD]:\}}y t|ƒWq tk rBtd||fƒ‚Yq Xq WxF|jƒD]:\}}y t|ƒWqRtk rŠtd||fƒ‚YqRXqRWt|tƒs¢t|ƒ}||_||_||_||_ d|_ dS)Nz*Positional argument %d is not hashable: %rz'Keyword argument %r is not hashable: %r) Ú enumerateÚhashr ÚitemsÚ isinstanceÚtupleÚ_HookEntry__hookÚ_HookEntry__argsÚ_HookEntry__kwargsÚ_HookEntry__hookableÚ_HookEntry__hash)rÚhookÚargsÚkwargsÚhookableÚnrrr r r Ú__init__Ds*   z_HookEntry.__init__cCs$|j|jko"|j|jko"|j|jkS)N)r(r)r*)rÚobjr r r Ú__cmp__cs  z_HookEntry.__cmp__cCs|js|jƒ|_|jS)N)r,Ú _compute_hash)rr r r Ú__hash__is z_HookEntry.__hash__cCs>t|jƒ}t|ƒt|jƒA}t|ƒttt|jjƒƒƒƒA}|S)N)r$r(r)r'Úsortedr*r%)rÚ hashvaluer r r r5ns  z_HookEntry._compute_hashcCs4|jr |j|jf|jž|jŽn|j|j|jŽdS)N)r+r(r)r*)rr r r Úrunusz_HookEntry.run)N)rrr r2r4r6r5r9r r r r r"Bs  r"c@sˆeZdZdZedd„ƒZdd„Zdd„ZeeeƒZdd „Z d d „Z ee e ƒZ d d „Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„ZdS)rz2An object which calls registered hooks on changes.cOst|dƒstƒ|_|jS)NÚ__real_hooks__)ÚhasattrÚsetr:)rrrr r r Ú __hooks__€s zHookable.__hooks__cCst|dƒsd|_|jS)NÚ__hooks_enabled__T)r;r>)rr r r Ú_get_hooks_enabled†s zHookable._get_hooks_enabledcCs ||_dS)N)r>)rZenabledr r r Ú_set_hooks_enabled‹szHookable._set_hooks_enabledcCst|dƒsd|_|jS)NÚ__hooks_frozen__F)r;rA)rr r r Ú_get_hooks_frozen�s zHookable._get_hooks_frozencCsB||jkrdS||_|r"tƒ|_nx|jD] }|jƒq*W|`dS)N)Ú hooks_frozenrAr<Ú__hooks_frozen_entries__r9)rZfreezeÚ hookentryr r r Ú_set_hooks_frozen•s    zHookable._set_hooks_frozencCs d|_dS)NT)rC)rr r r Ú freeze_hooks¤szHookable.freeze_hookscCs d|_dS)NF)rC)rr r r Ú thaw_hooks§szHookable.thaw_hookscOs|j|df|ž|ŽdS)N)Ú_Hookable__add_hook)rr-r.r/r r r Úadd_hookªszHookable.add_hookcOs|j||f|ž|ŽdS)N)rI)rr-r.r/r r r Úadd_hook_hookable­szHookable.add_hook_hookablecOs t||||d�}|jj|ƒdS)N)r0)r"r=Úadd)rr-Z _hookabler.r/rEr r r Z __add_hook°szHookable.__add_hookcOs|jjt|||ƒƒdS)N)r=Úremover")rr-r.r/r r r Ú remove_hook¶szHookable.remove_hookcCs8|jr4|js&x&|jD] }|jƒqWn|jj|jƒdS)N)Ú hooks_enabledrCr=r9rDÚupdate)rrEr r r rºs  zHookable._run_hooksN)rrr Ú__doc__Úpropertyr=r?r@rOrBrFrCrGrHrJrKrIrNrr r r r r|s   c @seZdZdZdZd d „Zd S)rz5A set object which calls registered hooks on changes.rLÚclearÚdifference_updateÚdiscardÚintersection_updateÚpoprMÚsymmetric_difference_updaterPcCstj|ƒ}tƒ|_|S)N)r<Úcopyr:)rr3r r r rYËs zHookableSet.copyN) rLrSrTrUrVrWrMrXrP)rrr rQrrYr r r r rÃs) rQÚ collectionsZsixrÚ__all__rrÚobjectr"rr<rr r r r Ús ":G