package fsm import ( "time" ) const ( // TickName is the name of Tick events, which Transition instances can use to enable // automatic progress on FSM instances in pull mode. TickName = "tick" ) type tickEvent[T any] struct { data T } func (t tickEvent[T]) Name() string { return TickName } func (t tickEvent[T]) Data() T { return t.data } // MakeChannelFeed builds a Feed enabling pull mode on an FSM. func MakeChannelFeed[T any](ch chan T, tick time.Duration) Feed[T] { ticker := time.NewTicker(tick) return func(fsm FSM[T]) Event[T] { var e Event[T] select { case <-fsm.Context().Done(): ticker.Stop() return e case <-ticker.C: return tickEvent[T]{} case e = <-ch: return e } } }