o
    iN
                     @   s   d dl mZ d dlZG dd dZG dd dZe ZG dd dZd	d
 Zdd Z	G dd dZ
dd ZG dd de
Zdd ZdS )    )pytreeNc                   @      e Zd Zdd ZdS )Tracerc                 C   s.   |d urt |tstdt| || _d S )Nz origin must be Application, not )
isinstanceApplication	TypeErrortypeorigin)selfr	    r   J/home/ubuntu/.local/lib/python3.10/site-packages/einx/_src/tracer/graph.py__init__   s   
zTracer.__init__N__name__
__module____qualname__r   r   r   r   r   r          r   c                   @   s   e Zd ZdddZdd ZdS )GraphNc                 C   s   || _ || _|| _d S N)inputsoutputname)r
   r   r   r   r   r   r   r      s   
zGraph.__init__c                 C   sB   t |tsdS | j|jkrdS | j|jkrdS | j|jkrdS dS )NFT)r   r   r   r   r   r
   otherr   r   r   __eq__   s   
zGraph.__eq__r   )r   r   r   r   r   r   r   r   r   r      s    
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )DependOnc                 C   s   t || _d S r   )listdependencies)r
   r   r   r   r   r   "      zDependOn.__init__c                 C   s"   t tdsg t_tj| j d S Nstack)hasattr	_dependonr    appendr   r
   r   r   r   	__enter__%   s   
zDependOn.__enter__c                 C   s   t j  d S r   )r"   r    pop)r
   exc_type	exc_value	tracebackr   r   r   __exit__*   r   zDependOn.__exit__N)r   r   r   r   r%   r*   r   r   r   r   r   !   s    r   c                  G   s   t | S r   )r   )r   r   r   r   	depend_on.   s   r+   c                  C   s(   g } t tdrtjD ]}| | q
| S r   )r!   r"   r    extend)resultdepsr   r   r   get_additional_dependencies2   s
   

r/   c                   @   r   )r   c                 C   s   || d| _ || _d S )Nr	   )r   r   )r
   r   r   r   r   r   r   ;   s   
zApplication.__init__Nr   r   r   r   r   r   :   r   r   c                    sT   t | tr(t  tr(t| t krdS | jd ur&t fdd| jjD S dS dS )NTc                 3   s    | ]}t | V  qd S r   )
depends_on).0inppredecessorr   r   	<genexpr>E   s    zdepends_on.<locals>.<genexpr>F)r   r   idr	   anyr   )xr5   r   r4   r   r1   @   s   
r1   c                       s,   e Zd Z fddZdd Zdd Z  ZS )Castc                    s8   t  j|g|d || _t|tstdt| d S )N)r   r   zinput must be Tracer, not )superr   inputr   r   r   r   )r
   r<   r   	__class__r   r   r   M   s
   
zCast.__init__c                    s   t | j fddS )Nc                    s   t  fddjS )Nc                    s
   |   S r   _tracer_typer9   r0   r   r   <lambda>T   s   
 z:Cast._tracer_transform.<locals>.<lambda>.<locals>.<lambda>)r   mapr   r0   r$   r0   r   rB   T   s    z(Cast._tracer_transform.<locals>.<lambda>)r:   r<   )r
   	transformr   r$   r   _tracer_transformS   s   zCast._tracer_transformc                 C   sJ   t |tsdS | j|jkrdS tdd | jtdd |jkr#dS dS )NFc                 S   s   | j S r   r?   rA   r   r   r   rB   [   s    zCast.__eq__.<locals>.<lambda>T)r   r:   r<   r   rC   r   r   r   r   r   r   V   s   
$zCast.__eq__)r   r   r   r   rE   r   __classcell__r   r   r=   r   r:   L   s    r:   c                 C   s   t | |jS r   )r:   r   )r<   r   r   r   r   cast`   s   rG   )einx._src.utilr   	threadingr   r   localr"   r   r+   r/   r   r1   r:   rG   r   r   r   r   <module>   s    