U
    cme(                     @  s   d dl mZ d dlZd dlmZ d dlmZ ejej	e
e
f ee
f ZG dd dZde_G dd dZd	d
dddZeefZG dd deZdddddZdddZG dd dZdS )    )annotationsN)ref)BoundMethodWeakrefc                   @  s$   e Zd Zdd Zdd Zdd ZdS )_symbolc                 C  s   | | _ | _dS )zConstruct a new named symbol.N)__name__name)selfr    r	   6/tmp/pip-unpacked-wheel-5zh6i7rd/blinker/_utilities.py__init__   s    z_symbol.__init__c                 C  s   t | jffS N)symbolr   r   r	   r	   r
   
__reduce__   s    z_symbol.__reduce__c                 C  s   | j S r   )r   r   r	   r	   r
   __repr__   s    z_symbol.__repr__N)r   
__module____qualname__r   r   r   r	   r	   r	   r
   r      s   r   r   c                   @  s   e Zd ZdZi Zdd ZdS )r   a?  A constant symbol.

    >>> symbol('foo') is symbol('foo')
    True
    >>> symbol('foo')
    foo

    A slight refinement of the MAGICCOOKIE=object() pattern.  The primary
    advantage of symbol() is its repr().  They are also singletons.

    Repeated calls of symbol('name') will all return the same instance.

    c                 C  s8   z| j | W S  tk
r2   | j |t| Y S X d S r   )symbolsKeyError
setdefaultr   )clsr   r	   r	   r
   __new__+   s    zsymbol.__new__N)r   r   r   __doc__r   r   r	   r	   r	   r
   r      s   objectIdentityType)objreturnc                 C  sZ   t | drt| jt| jfS t | dr<t| jt| jfS t| ttfrN| S t| S d S )N__func__im_func)	hasattridr   __self__r   im_self
isinstanceintstr)r   r	   r	   r
   hashable_identity2   s    

r&   c                   @  s"   e Zd ZU dZded< ded< dS )annotatable_weakrefz7A weakref.ref that supports custom instance attributes.zt.Optional[IdentityType]Zreceiver_idZ	sender_idN)r   r   r   r   __annotations__r	   r	   r	   r
   r'   @   s   
r'   )r   c                 K  s@   t | rt| |}n
t| |}| D ]\}}t||| q&|S )zReturn an annotated weak ref.)callablecallable_referencer'   itemssetattr)r   callbackr   Zweakkeyvaluer	   r	   r
   	referenceG   s    
r0   c                 C  sJ   t | dr | jdk	r t| |dS t | dr@| jdk	r@t| |dS t| |S )z@Return an annotated weak ref, supporting bound instance methods.r"   N)targetZ	on_deleter!   )r   r"   r   r!   r'   )r   r-   r	   r	   r
   r*   T   s
    r*   c                   @  s    e Zd ZdZdd Zdd ZdS )lazy_propertyz(A @property that is only evaluated once.c                 C  s   || _ |j| _d S r   )	_deferredr   )r   deferredr	   r	   r
   r   `   s    zlazy_property.__init__c                 C  s*   |d kr| S |  |}t|| j j| |S r   )r3   r,   r   )r   r   r   r/   r	   r	   r
   __get__d   s
    
zlazy_property.__get__N)r   r   r   r   r   r5   r	   r	   r	   r
   r2   ]   s   r2   )N)N)
__future__r   typingtweakrefr   Zblinker._saferefr   UnionTupler$   r%   r   r   r   r   r&   Z	WeakTypesr'   r0   r*   r2   r	   r	   r	   r
   <module>   s    
	