vRp.CD2g_test/utils/fsm/options.go

57 lines
2.4 KiB
Go

package fsm
type Option[State comparable, Data any] func(fsm *FSM[State, Data], state State)
// WithEnterBeforeEvent 设置状态进入前的回调
// - 在首次设置状态时,状态机本身的当前状态为零值状态
func WithEnterBeforeEvent[State comparable, Data any](fn func(state *FSM[State, Data])) Option[State, Data] {
return func(fsm *FSM[State, Data], state State) {
if fsm.enterBeforeEventHandles == nil {
fsm.enterBeforeEventHandles = map[State][]func(state *FSM[State, Data]){}
}
fsm.enterBeforeEventHandles[state] = append(fsm.enterBeforeEventHandles[state], fn)
}
}
// WithEnterAfterEvent 设置状态进入后的回调
func WithEnterAfterEvent[State comparable, Data any](fn func(state *FSM[State, Data])) Option[State, Data] {
return func(fsm *FSM[State, Data], state State) {
if fsm.enterAfterEventHandles == nil {
fsm.enterAfterEventHandles = map[State][]func(state *FSM[State, Data]){}
}
fsm.enterAfterEventHandles[state] = append(fsm.enterAfterEventHandles[state], fn)
}
}
// WithUpdateEvent 设置状态内刷新的回调
func WithUpdateEvent[State comparable, Data any](fn func(state *FSM[State, Data])) Option[State, Data] {
return func(fsm *FSM[State, Data], state State) {
if fsm.updateEventHandles == nil {
fsm.updateEventHandles = map[State][]func(state *FSM[State, Data]){}
}
fsm.updateEventHandles[state] = append(fsm.updateEventHandles[state], fn)
}
}
// WithExitBeforeEvent 设置状态退出前的回调
// - 该阶段状态机的状态为退出前的状态,而非新的状态
func WithExitBeforeEvent[State comparable, Data any](fn func(state *FSM[State, Data])) Option[State, Data] {
return func(fsm *FSM[State, Data], state State) {
if fsm.exitBeforeEventHandles == nil {
fsm.exitBeforeEventHandles = map[State][]func(state *FSM[State, Data]){}
}
fsm.exitBeforeEventHandles[state] = append(fsm.exitBeforeEventHandles[state], fn)
}
}
// WithExitAfterEvent 设置状态退出后的回调
// - 该阶段状态机的状态为新的状态,而非退出前的状态
func WithExitAfterEvent[State comparable, Data any](fn func(state *FSM[State, Data])) Option[State, Data] {
return func(fsm *FSM[State, Data], state State) {
if fsm.exitAfterEventHandles == nil {
fsm.exitAfterEventHandles = map[State][]func(state *FSM[State, Data]){}
}
fsm.exitAfterEventHandles[state] = append(fsm.exitAfterEventHandles[state], fn)
}
}