57 lines
2.4 KiB
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)
|
|
}
|
|
}
|