o
    -wi                  	   @   s  U d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZ ddlmZmZmZmZ edddZed	Zed
ddZedddZeG dd dee ZeG dd dee ZeG dd dee ZeG dd deeef ZeG dd dee ZeG dd deeef Zeee ee ee eeef ee eeef f Zeed< eG dd deeef Zeeeeef  e
eeef  f Zeed< eedf Z eed< G dd  d eeef Z!e!edf Z"eed!< dS )"a  Finite state machine.

Simple FSM implementation.

Usage:
    ```python
    class A:
        def on_output(self, inputs) -> None:
            pass


    class B:
        def on_output(self, inputs) -> None:
            pass


    def to_b(inputs) -> bool:
        return True


    def to_a(inputs) -> bool:
        return True


    f = Fsm(states=[A(), B()], table={A: [(to_b, B)], B: [(to_a, A)]})
    f.run({"input1": 1, "input2": 2})
    ```
    )abstractmethod)	dataclass)CallableDictGenericOptionalSequenceTypeUnion)Protocol	TypeAliasTypeVarruntime_checkableT_FsmInputsT)contravariantT_FsmContextT_FsmContext_cov)	covariantT_FsmContext_contrac                   @   "   e Zd ZededdfddZdS )FsmStateCheckinputsreturnNc                 C      d S N selfr   r   r   N/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/wandb/sdk/lib/fsm.pyon_check-      zFsmStateCheck.on_check)__name__
__module____qualname__r   r   r   r   r   r   r   r   +       r   c                   @   r   )FsmStateOutputr   r   Nc                 C   r   r   r   r   r   r   r   on_state3   r    zFsmStateOutput.on_state)r!   r"   r#   r   r   r&   r   r   r   r   r%   1   r$   r%   c                   @   r   )FsmStateEnterr   r   Nc                 C   r   r   r   r   r   r   r   on_enter9   r    zFsmStateEnter.on_enter)r!   r"   r#   r   r   r(   r   r   r   r   r'   7   r$   r'   c                   @   s&   e Zd ZedededdfddZdS )FsmStateEnterWithContextr   contextr   Nc                 C   r   r   r   )r   r   r*   r   r   r   r(   ?   s   z!FsmStateEnterWithContext.on_enter)r!   r"   r#   r   r   r   r(   r   r   r   r   r)   =   s    r)   c                   @   r   )FsmStateStayr   r   Nc                 C   r   r   r   r   r   r   r   on_stayG   r    zFsmStateStay.on_stay)r!   r"   r#   r   r   r,   r   r   r   r   r+   E   r$   r+   c                   @   s"   e Zd ZededefddZdS )FsmStateExitr   r   c                 C   r   r   r   r   r   r   r   on_exitM   r    zFsmStateExit.on_exitN)r!   r"   r#   r   r   r   r.   r   r   r   r   r-   K   r$   r-   FsmStatec                   @   sN   e Zd ZU eegef ed< eeee	f  ed< dZ
eeegdf  ed< dS )FsmEntry	conditiontarget_stateNaction)r!   r"   r#   r   r   bool__annotations__r	   r/   r   r3   r   r   r   r   r   r0   _   s   
 r0   FsmTableWithContextNFsmTablec                	   @   s   e Zd ZU eee ef ed< eee	f ed< eee	f ed< e
e ed< de
e deee	f ddfd	d
Zdedeeee	f  deeegdf  ddfddZdeddfddZdeddfddZdS )FsmWithContext_state_dict_table_state_statesstatestabler   Nc                 C   s4   || _ || _dd |D | _| jt|d  | _d S )Nc                 S   s   i | ]}t ||qS r   )type).0sr   r   r   
<dictcomp>|   s    z+FsmWithContext.__init__.<locals>.<dictcomp>r   )r<   r:   r9   r?   r;   )r   r=   r>   r   r   r   __init__u   s   zFsmWithContext.__init__r   	new_stater3   c                 C   s   |r|| d }t | jtr| j|}t| j}||kr-t | jtr+| j| d S d S | j| | _|rEt | jtrE| jj	||d d S t | jt
rS| j	| d S d S )N)r*   )
isinstancer;   r-   r.   r?   r+   r,   r9   r)   r(   r'   )r   r   rD   r3   r*   
prev_stater   r   r   _transition   s    
zFsmWithContext._transitionc                 C   s<   | j t| j D ]}||r| ||j|j  d S qd S r   )r:   r?   r;   r1   rG   r2   r3   )r   r   entryr   r   r   _check_transitions   s   
z!FsmWithContext._check_transitionsc                 C   sB   t | jtr| j| | | t | jtr| j| d S d S r   )rE   r;   r   r   rI   r%   r&   r   r   r   r   input   s   
zFsmWithContext.input)r!   r"   r#   r   r	   r/   r5   r6   r   r   r   rC   r   r   rG   rI   rJ   r   r   r   r   r8   o   s.   
 



r8   Fsm)#__doc__abcr   dataclassesr   typingr   r   r   r   r   r	   r
   typing_extensionsr   r   r   r   r   r   r   r   r   r%   r'   r)   r+   r-   r/   r5   r0   r6   r7   r8   rK   r   r   r   r   <module>   sP   $	


6