o
    iJ                     @   s   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 ddlmZmZ G dd deZeG d	d
 d
Zdd Zdd Zdd Zdd ZdS )    )	dataclass)Enum)TopologicalSorter)	AnnotatedAnyget_args
get_origin   )
UnionTypesis_dependentc                   @   s0   e Zd ZdZdZdZdZdd Zedd Z	dS )	Orderr	   r   Nc                 C   s$   | t ju rt jS | t ju rt jS | S N)r   LESSMORE)self r   K/home/ubuntu/.local/lib/python3.10/site-packages/spaces/_vendor/ovld/mro.pyopposite   s
   

zOrder.oppositec                 C   sL   t | } | tjhkrtjS | tjtjh stjS | tjtjh s#tjS tjS r   )setr   SAMEr   r   NONE)ordersr   r   r   merge   s   zOrder.merge)
__name__
__module____qualname__r   r   r   r   r   staticmethodr   r   r   r   r   r   	   s    r   c                   @   s.   e Zd ZU eed< eZeed< eZeed< dS )TypeRelationshiporder	supertypesubtypeN)	r   r   r   r   __annotations__NotImplementedr    boolr!   r   r   r   r   r   $   s   
 r   c                 C   s^  | |krt jS | tu rt jS |tu rt jS t| dr%| | }tur%|S t|dr7||  }tur7| S t	| }t	|}|t
u r||t
u r|t| ^} }t|^}}tdd |D dd}tdd |D dd}||k rpt jS ||k rwt jS t| |S |t
u r|t
u rt jS tt| d |S |t
u r| t
u rt jS t| t|d S |r|st||  S |r|st||}	|	t ju rt j}	|	S t|| }	t jur|	S t| }
t|}|
r|st jS |r|
st jS t|
t|krt jS dd t|
|D }t |S t| tr
t|tst jS t| |}t|| }|r |r t jS |r&t jS |r,t jS t jS )a\  Order relation between two types.

    Returns a member of the Order enum.

    * typeorder(t1, t2) is Order.LESS   if t2 is more general than t1
    * typeorder(t1, t2) is Order.SAME   if t1 is equal to t2
    * typeorder(t1, t2) is Order.MORE   if t1 is more general than t2
    * typeorder(t1, t2) is Order.NONE   if they cannot be compared
    __type_order__c                 S      g | ]}t |d dqS annotation_priorityr   getattr.0annr   r   r   
<listcomp>M       ztypeorder.<locals>.<listcomp>r   )defaultc                 S   r&   r'   r)   r+   r   r   r   r.   N   r/   c                 S   s   g | ]	\}}t ||qS r   )	typeorderr,   a1a2r   r   r   r.   v       )r   r   r   r   r   hasattrr%   r#   r   r   r   r   maxr1   lenr   zipr   
isinstancetype
issubclass)t1t2resulto1o2r3   r4   p1p2r   args1args2ordssxsyr   r   r   r1   +   s   






r1   c                    s0    |v rdS t  trt fdd|D S dS )NTc                 3       | ]}t | V  qd S r   )r:   )r,   xmainr   r   	<genexpr>       z_find_ann.<locals>.<genexpr>F)r:   r;   any)rL   othersr   rK   r   	_find_ann   s
   
rQ   c                    s  | |ks|t u r
dS t|dr||  }tur|S t| dr*| | }tur*|S t|r0dS |tv r9t| |S t| }t|}|t	u re|t	u ret
| ^}  t
|^}}t| |odt fdd|D S |t	u rm|t	u S t|tstd}t|ts{d}|s|r|tvr|p| }|p|}t|trt|trt||r||u rdS t
| }t
|}t|t|krdS tdd t||D S dS zt| |W S  ty   Y dS w )	z'Check whether t1 is a "subclass" of t2.T__is_supertype____is_subtype__c                 3   rI   r   )rQ   )r,   rL   r3   r   r   rM      rN   z subclasscheck.<locals>.<genexpr>NFc                 s   s    | ]
\}}t ||V  qd S r   subclasscheckr2   r   r   r   rM      s    )r   r6   rR   r#   rS   r   r
   r:   r   r   r   rV   rO   r;   r<   r8   allr9   	TypeError)r=   r>   r?   r@   rA   r4   rD   rE   r   rT   r   rV      sV   
 

rV   c           
      #   s     fdd|D }dd |D }t |D ]-\}}||d d  D ] }t||}|tju r5|| | q!|tju rA|| | q!qt|}|  | rf|	 }|V  |D ]}	|
|	 qX| sOd S d S )Nc                    s   g | ]	}t  |r|qS r   rU   r,   tclsr   r   r.      r5   zsort_types.<locals>.<listcomp>c                 S   s   i | ]}|t  qS r   )r   rY   r   r   r   
<dictcomp>   s    zsort_types.<locals>.<dictcomp>r	   )	enumerater1   r   r   addr   r   prepare	is_active	get_readydone)
r\   availdepsir=   r>   r   sorternodesnr   r[   r   
sort_types   s(   


rj   N)dataclassesr   enumr   graphlibr   typingr   r   r   r   utilsr
   r   r   r   r1   rQ   rV   rj   r   r   r   r   <module>   s    ^	>