o
    i                     @  s  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZmZmZ d d
lmZ d dlmZmZmZmZmZ d dlmZ dZ	 ed Z	 ed Z eG dd dZ!eG dd dZ"d%ddZ#eG dd dZ$d&d"d#Z%d$S )'    )annotations)defaultdict)	dataclass)Literal)assert_never)Decision)NodeID)Join)EndNodeFork	StartNode)AnyNode)BroadcastMarkerDestinationMarkerLabelMarker	MapMarkerPath)Stepzfill:#fdff32)TBLRRLBT)	broadcastmapjoinstartendstepdecisionc                   @  s2   e Zd ZU dZded< ded< ded< ded< d	S )
MermaidNodezA mermaid node.stridNodeKindkind
str | NonelabelnoteN__name__
__module____qualname____doc____annotations__ r-   r-   a/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/pydantic_graph/beta/mermaid.pyr   !   s   
 r   c                   @  s*   e Zd ZU dZded< ded< ded< dS )MermaidEdgezA mermaid edge.r    start_idend_idr$   r%   Nr'   r-   r-   r-   r.   r/   +   s
   
 r/   graph_nodesdict[NodeID, AnyNode]graph_edges_by_sourcedict[NodeID, list[Path]]returnMermaidGraphc                   sL  g }t t d fdd}|  D ]T\}}d	}d	}t|tr!d
}n7t|tr)d}n/t|tr4d}|j}n$t|tr<d}nt|t	rI|j
rFdnd}nt|trTd}|j}nt| t||||d}	||	 q| D ]\}
}|D ]}|||
 qpqj|  D ]}t|tr|jD ]	}||j|j qq}t fdd|D tt  }t||S )zBuild a mermaid graph.pathr   last_source_idr   r6   Nonec                   s^   d }| j D ]'}t|ttB rJ dt|tr|j}qt|tr, | t||j	| qd S )Nz-These should be removed during Graph building)
items
isinstancer   r   r   r%   r   appendr/   destination_id)r8   r9   working_labelitemedges_by_sourcer-   r.   _collect_edges;   s   


z+build_mermaid_graph.<locals>._collect_edgesNr   r   r   r   r   r   r   )r!   r#   r%   r&   c                   s   g | ]	}  |jg qS r-   )getr!   ).0noderA   r-   r.   
<listcomp>f   s    z'build_mermaid_graph.<locals>.<listcomp>)r8   r   r9   r   r6   r:   )r   listr;   r<   r   r
   r   r%   r	   r   is_mapr   r&   r   r   r=   valuesbranchesr8   r!   sumr/   r7   )r2   r4   nodesrC   node_idrF   r%   r&   r#   source_nodekvr8   branchedgesr-   rA   r.   build_mermaid_graph4   sD   	








rT   c                   @  sL   e Zd ZU dZded< ded< dZded< dZd	ed
< 			ddddZdS )r7   zA mermaid graph.list[MermaidNode]rM   list[MermaidEdge]rS   Nr$   titleStateDiagramDirection | None	directionTedge_labelsboolc                 C  s  g }|rdd| dg}| d |d ur| d|  t| j| j\}}|D ]u}g }|jdks6|jdkr7na|jdkrSd|j }	|jrM|	d	|j 7 }	| |	 nE|jd
krad|j dg}n7|jdksk|jdkrtd|j dg}n$|jdkrd|j dg}|jr| d|j d|j d nt|j |	| q(| d |D ]2}
|
j
tjkrdn|
j
}|
jtjkrdn|
j}d| d| }|
jr|r|d	|
j 7 }| | qd|S )Nz---ztitle: zstateDiagram-v2z  direction r   r   r   z  z: r   z  state z	 <<join>>r   r   z	 <<fork>>r   z <<choice>>z  note right of z
    z
  end note z[*]z --> 
)r=   _topological_sortrM   rS   r#   r!   r%   r&   r   extendr0   r   r1   r
   r   )selfrY   rW   rZ   linesrM   rS   rF   
node_lineslineedgerender_start_idrender_end_id	edge_liner-   r-   r.   rendert   sH   







zMermaidGraph.render)NNT)rY   rX   rW   r$   rZ   r[   )r(   r)   r*   r+   r,   rW   rY   rh   r-   r-   r-   r.   r7   j   s   
 rM   rU   rS   rV   +tuple[list[MermaidNode], list[MermaidEdge]]c           
        s   t t}|D ]}||j |j qi  tjdfg}d tj< |rD|d\}}|| D ]}| vrA|d  |< |||d f q,|s!t|  fddd}t| fddd}	||	fS )zSort nodes and edges in a logical topological order.

    Uses BFS from the start node to assign depths, then sorts:
    - Nodes by their distance from start
    - Edges by the distance of their source and target nodes
    r      c                   s     | jtd| jfS Ninf)rD   r!   float)ndepthsr-   r.   <lambda>   s    z#_topological_sort.<locals>.<lambda>)keyc                   s,     | jtd  | jtd| j| jfS rk   )rD   r0   rm   r1   )ero   r-   r.   rq      s
   )	r   rH   r0   r=   r1   r   r!   popsorted)
rM   rS   	adjacencyrd   queuerN   depthnext_idsorted_nodessorted_edgesr-   ro   r.   r^      s(   

	

r^   N)r2   r3   r4   r5   r6   r7   )rM   rU   rS   rV   r6   ri   )&
__future__r   collectionsr   dataclassesr   typingr   typing_extensionsr   pydantic_graph.beta.decisionr   pydantic_graph.beta.id_typesr   pydantic_graph.beta.joinr	   pydantic_graph.beta.noder
   r   r   pydantic_graph.beta.node_typesr   pydantic_graph.beta.pathsr   r   r   r   r   pydantic_graph.beta.stepr   DEFAULT_HIGHLIGHT_CSSStateDiagramDirectionr"   r   r/   rT   r7   r^   r-   r-   r-   r.   <module>   s2    	
6;