U
    d                     @  s   d dl mZ d dlZd dlZd dlZd dlZd dlm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ddddZdS )    )annotationsN)partial)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-q4ucjurn/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_identity6   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(   D   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   	referenceK   s    
r1   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+   X   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   d   s    zlazy_property.__init__c                 C  s*   |d kr| S |  |}t|| j j| |S r   )r4   r-   r   )r	   r   r   r0   r
   r
   r   __get__h   s
    
zlazy_property.__get__N)r   r   r   r   r   r6   r
   r
   r
   r   r3   a   s   r3   zt.Anybool)funcr   c                 C  s   t jdkrt| S z ddlm} t| |r2W dS W n tk
rH   Y nX t	| r\| j
} qJt| trn| j} q\t| s|dS | jjtj@ rdS tjj}t| dd |kS d S )N)      r   )	AsyncMockTF_is_coroutine)sysversion_infoasyncioiscoroutinefunctionZunittest.mockr;   r$   ImportErrorinspectismethodr   r   r8   
isfunction__code__co_flagsCO_COROUTINEZ
coroutinesr<   getattr)r8   r;   Zacicr
   r
   r   is_coroutine_functionp   s$    






rI   )N)N)
__future__r   r?   rB   r=   typingt	functoolsr   weakrefr   Zblinker._saferefr   UnionTupler%   r&   r   r   r   r   r'   Z	WeakTypesr(   r1   r+   r3   rI   r
   r
   r
   r   <module>   s&    
	