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
		}
	}
}