package com.serliunx.statemanagement.machine;
import com.serliunx.statemanagement.machine.external.FlexibleStateMachine;
import com.serliunx.statemanagement.machine.handler.StateHandler;
import java.util.concurrent.Executor;
/**
* 状态机之状态事件注册
*
注册状态切换时的事件, 一般用于状态机构建和支持动态调整的状态机{@link FlexibleStateMachine};
* 当然实际不仅于此, 任何相关的都可以使用.
*
* @author SerLiunx
* @since 2025/3/28
* @see FlexibleStateMachine
*/
public interface StateEventRegistry {
/**
* 添加进入事件
* 切换到了指定状态时执行的逻辑
*
* @param state 状态
* @param handler 处理逻辑
* @param async 是否异步执行
* @param executor 异步执行器, 异步执行时将使用, 不指定时将使用状态机内置的执行器
*/
StateEventRegistry whenEntry(S state, StateHandler handler, Boolean async, Executor executor);
/**
* 添加进入事件
* 切换到了指定状态时执行的逻辑
*
* @param state 状态
* @param handler 处理逻辑
* @param async 是否异步执行
*/
StateEventRegistry whenEntry(S state, StateHandler handler, Boolean async);
/**
* 添加进入事件
* 切换到了指定状态时执行的逻辑
*
* @param state 状态
* @param handler 处理逻辑
*/
StateEventRegistry whenEntry(S state, StateHandler handler);
/**
* 添加离开事件
* 从指定状态切换到别的状态时执行的逻辑
*
* @param state 状态
* @param handler 处理逻辑
* @param async 是否异步执行
* @param executor 异步执行器, 异步执行时将使用, 不指定时将使用状态机内置的执行器
*/
StateEventRegistry whenLeave(S state, StateHandler handler, Boolean async, Executor executor);
/**
* 添加离开事件
* 从指定状态切换到别的状态时执行的逻辑
*
* @param state 状态
* @param handler 处理逻辑
* @param async 是否异步执行
*/
StateEventRegistry whenLeave(S state, StateHandler handler, Boolean async);
/**
* 添加离开事件
* 从指定状态切换到别的状态时执行的逻辑
*
* @param state 状态
* @param handler 处理逻辑
*/
StateEventRegistry whenLeave(S state, StateHandler handler);
/**
* 添加交换事件
* 从A状态切换至B状态时触发
*
* @param from 源状态
* @param to 目的状态
* @param handler 处理器
* @param async 是否异步执行
* @param executor 异步执行器, 异步执行时将使用, 不指定时将使用状态机内置的执行器
*/
StateEventRegistry exchange(S from, S to, StateHandler handler, Boolean async, Executor executor);
/**
* 添加交换事件
* 从A状态切换至B状态时触发
*
* @param from 源状态
* @param to 目的状态
* @param handler 处理器
* @param async 是否异步执行
*/
StateEventRegistry exchange(S from, S to, StateHandler handler, Boolean async);
/**
* 添加交换事件
* 从A状态切换至B状态时触发
*
* @param from 源状态
* @param to 目的状态
* @param handler 处理器
*/
StateEventRegistry exchange(S from, S to, StateHandler handler);
}