Skip to content

Instantly share code, notes, and snippets.

@Maximusya
Last active June 10, 2016 12:05
Show Gist options
  • Save Maximusya/9d921711a46a4c7990125df41ffc136d to your computer and use it in GitHub Desktop.
Save Maximusya/9d921711a46a4c7990125df41ffc136d to your computer and use it in GitHub Desktop.
State machine representing a smart doll reacting to Lull, and noise commands. Uses https://github.com/dotnet-state-machine/stateless
using System;
using Stateless;
/// <summary>
/// https://dotnetfiddle.net/Udzhcs
/// </summary>
public class Program
{
enum State { Awake, Sleep, LightSleep, DeadSleep }
enum Trigger { Lull, Whisper, Scream }
public static void Main()
{
var doll = new StateMachine<State, Trigger>(State.Awake);
doll.Configure(State.Awake)
.Permit(Trigger.Lull, State.LightSleep)
.Ignore(Trigger.Whisper)
.Ignore(Trigger.Scream);
doll.Configure(State.Sleep)
.Ignore(Trigger.Lull)
.Permit(Trigger.Whisper, State.Awake)
.Permit(Trigger.Scream, State.Awake);
doll.Configure(State.LightSleep)
.SubstateOf(State.Sleep)
.Permit(Trigger.Lull, State.DeadSleep);
doll.Configure(State.DeadSleep)
.SubstateOf(State.Sleep)
.Ignore(Trigger.Whisper);
Print(doll);
// To light sleep and back
Fire(doll, Trigger.Lull); Print(doll);
Fire(doll, Trigger.Whisper); Print(doll);
Fire(doll, Trigger.Whisper); Print(doll);
Fire(doll, Trigger.Scream); Print(doll);
// To dead sleep and back
Fire(doll, Trigger.Lull); Print(doll);
Fire(doll, Trigger.Lull); Print(doll);
Fire(doll, Trigger.Lull); Print(doll);
Fire(doll, Trigger.Whisper); Print(doll);
Fire(doll, Trigger.Scream); Print(doll);
}
static void Print(StateMachine<State, Trigger> sm)
{
Console.WriteLine("[Status:] {0}", sm);
}
static void Fire(StateMachine<State, Trigger> sm, Trigger trigger)
{
Console.WriteLine("[Firing:] {0}", trigger);
sm.Fire(trigger);
}
}
using System;
using Stateless;
/// <summary>
/// https://dotnetfiddle.net/bLoKXO
/// </summary>
public class Program
{
enum State { Awake, Sleep }
enum Trigger { Lull, Noise }
enum NoiseVolume { Quiet, Loud }
public static void Main()
{
var doll = new StateMachine<State, Trigger>(State.Awake);
var noiseTrigger = doll.SetTriggerParameters<NoiseVolume>(Trigger.Noise);
doll.Configure(State.Awake)
.Permit(Trigger.Lull, State.Sleep)
.Ignore(Trigger.Noise);
doll.Configure(State.Sleep)
.Ignore(Trigger.Lull)
.PermitDynamic(noiseTrigger, vol => vol == NoiseVolume.Loud ? State.Awake : State.Sleep);
Print(doll);
// To sleep and back
Fire(doll, Trigger.Lull); Print(doll);
Fire(doll, noiseTrigger, NoiseVolume.Quiet); Print(doll);
Fire(doll, noiseTrigger, NoiseVolume.Loud); Print(doll);
// Noise in awake state
Fire(doll, noiseTrigger, NoiseVolume.Quiet); Print(doll);
Fire(doll, noiseTrigger, NoiseVolume.Loud); Print(doll);
}
static void Print(StateMachine<State, Trigger> sm)
{
Console.WriteLine("[Status:] {0}", sm);
}
static void Fire(StateMachine<State, Trigger> sm, Trigger trigger)
{
Console.WriteLine("[Firing:] {0}", trigger);
sm.Fire(trigger);
}
static void Fire<TParam>(StateMachine<State, Trigger> sm, StateMachine<State, Trigger>.TriggerWithParameters<TParam> trigger, TParam triggerParameter)
{
Console.WriteLine("[Firing:] {0} {1}", trigger.Trigger, triggerParameter);
sm.Fire(trigger, triggerParameter);
}
}
using System;
using Stateless;
/// <summary>
/// https://dotnetfiddle.net/OHprNM
/// </summary>
public class Program
{
enum State { Awake, Sleep, LightSleep, DeadSleep }
enum Trigger { Lull, Noise }
enum NoiseVolume { Quiet, Loud }
public static void Main()
{
var doll = new StateMachine<State, Trigger>(State.Awake);
var noiseTrigger = doll.SetTriggerParameters<NoiseVolume>(Trigger.Noise);
doll.Configure(State.Awake)
.Permit(Trigger.Lull, State.LightSleep)
.Ignore(Trigger.Noise);
doll.Configure(State.Sleep)
.Ignore(Trigger.Lull)
.Permit(Trigger.Noise, State.Awake);
doll.Configure(State.LightSleep)
.SubstateOf(State.Sleep)
.Permit(Trigger.Lull, State.DeadSleep);
doll.Configure(State.DeadSleep)
.SubstateOf(State.Sleep)
.PermitDynamic(noiseTrigger, vol => vol == NoiseVolume.Loud ? State.Awake : State.DeadSleep);
// .IgnoreDynamic(noiseTrigger, vol => vol == NoiseVolume.Quiet); // alternative
Print(doll);
// To light sleep and back
Fire(doll, Trigger.Lull); Print(doll);
Fire(doll, noiseTrigger, NoiseVolume.Quiet); Print(doll);
Fire(doll, noiseTrigger, NoiseVolume.Quiet); Print(doll);
Fire(doll, noiseTrigger, NoiseVolume.Loud); Print(doll);
// To dead sleep and back
Fire(doll, Trigger.Lull); Print(doll);
Fire(doll, Trigger.Lull); Print(doll);
Fire(doll, Trigger.Lull); Print(doll);
Fire(doll, noiseTrigger, NoiseVolume.Quiet); Print(doll);
Fire(doll, noiseTrigger, NoiseVolume.Loud); Print(doll);
}
static void Print(StateMachine<State, Trigger> sm)
{
Console.WriteLine("[Status:] {0}", sm);
}
static void Fire(StateMachine<State, Trigger> sm, Trigger trigger)
{
Console.WriteLine("[Firing:] {0}", trigger);
sm.Fire(trigger);
}
static void Fire<TParam>(StateMachine<State, Trigger> sm, StateMachine<State, Trigger>.TriggerWithParameters<TParam> trigger, TParam triggerParameter)
{
Console.WriteLine("[Firing:] {0} {1}", trigger.Trigger, triggerParameter);
sm.Fire(trigger, triggerParameter);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment