public enum CakeState { Start, MixIngredients, PreheatOven, PourBatter, Bake, Cool, Finish }
public enum CakeTrigger { GatherIngredients, IngredientsMixed, OvenPreheated, BatterPoured, CakeBaked, CakeCooled, CakeFinished }
public class CakeBakingStateMachine
private StateMachine<CakeState, CakeTrigger> stateMachine;
public CakeBakingStateMachine()
stateMachine = new StateMachine<CakeState, CakeTrigger>(CakeState.Start);
stateMachine.Configure(CakeState.Start).Permit(CakeTrigger.GatherIngredients, CakeState.MixIngredients);
stateMachine.Configure(CakeState.MixIngredients).Permit(CakeTrigger.IngredientsMixed, CakeState.PreheatOven);
stateMachine.Configure(CakeState.PreheatOven).Permit(CakeTrigger.OvenPreheated, CakeState.PourBatter);
stateMachine.Configure(CakeState.PourBatter).Permit(CakeTrigger.BatterPoured, CakeState.Bake);
stateMachine.Configure(CakeState.Bake).Permit(CakeTrigger.CakeBaked, CakeState.Cool);
stateMachine.Configure(CakeState.Cool).Permit(CakeTrigger.CakeCooled, CakeState.Finish);
stateMachine.Configure(CakeState.Finish).Permit(CakeTrigger.CakeFinished, CakeState.Start);
public void Trigger(CakeTrigger trigger) => stateMachine.Fire(trigger);
public CakeState GetCurrentState() => stateMachine.State;
public static void Main(string[] args)
var cakeMachine = new CakeBakingStateMachine();
Console.WriteLine($"Current state: {cakeMachine.GetCurrentState()}");
cakeMachine.Trigger(CakeTrigger.GatherIngredients);
Console.WriteLine($"Current state: {cakeMachine.GetCurrentState()}");
cakeMachine.Trigger(CakeTrigger.IngredientsMixed);
Console.WriteLine($"Current state: {cakeMachine.GetCurrentState()}");
cakeMachine.Trigger(CakeTrigger.OvenPreheated);
Console.WriteLine($"Current state: {cakeMachine.GetCurrentState()}");
cakeMachine.Trigger(CakeTrigger.BatterPoured);
Console.WriteLine($"Current state: {cakeMachine.GetCurrentState()}");
cakeMachine.Trigger(CakeTrigger.CakeBaked);
Console.WriteLine($"Current state: {cakeMachine.GetCurrentState()}");
cakeMachine.Trigger(CakeTrigger.CakeCooled);
Console.WriteLine($"Current state: {cakeMachine.GetCurrentState()}");
cakeMachine.Trigger(CakeTrigger.CakeFinished);
Console.WriteLine($"Current state: {cakeMachine.GetCurrentState()}");