A simple "stateless" finite-state
machine library for .NET.
Integrated DNA Technologies
What is it?
Open-source .NET library
“A finite-state machine (FSM) … is a mathematical model of
computation used to design both computer programs and
sequential logic circuits. It is conceived as an abstract machine that
can be in one of a finite number of states. The machine is in only
one state at a time; the state it is in at any given time is called the
current state. It can change from one state to another when
initiated by a triggering event or condition; this is called a transition.
A particular FSM is defined by a list of its states, and the triggering
condition for each transition.” – Wikipedia
What is it? (continued)
Domain-specific language (DSL)
Text tables can be provided by callers, loaded from a data store, stored in
configuration – whatever works for you
Given the same arguments, every function always returns the same values
No side effects
Great for web services (inherently stateless)
Thread safe (unless I goofed)
Locked | coin | Unlocked
Unlocked | coin | Unlocked
Unlocked | pass | Locked
Initial state (first line)
Why would I need it?
You’re trying to solve a problem that looks like a state machine.
“I have that horrible feeling when I know that almost the only thing I can say is
that you should use a State Machine when the behavior you’re specifying
feels like a State Machine – that is, when you have a sense of movement,
triggered by events, from state to state. In many ways, the best way to see if a
State Machine is appropriate is to try sketching one on paper and, if it fits
well, to try it in action.” – Martin Fowler, Domain-Specific Languages
Why would I not need it?
You want to associate actions or guards (behavior/code) with
transitions or with entering/exiting states.
FSM.NET machines are designed to be self-contained, without requiring binary
references to custom code.
FSM.NET machines are designed to be deserialized from text.
Custom code actions could be added through a wrapper (web service, etc.).
You want to embed a state machine in a non-.NET application.
FSM.NET can be used through a web service, though.
Why is FSM.NET written in F#?
Easier to verify correctness
Immutable by default
Less code – let’s see!
Easier to write thread-safe code
Interop with other .NET libraries
Other options (in no particular order)
… and many more
Don’t reinvent the wheel! (Like I did…)
(Caveat: I have not evaluated all of the above options.)
// Stateless example using enums
var turnstile = new StateMachine<States, Events>(States.Locked);
turnstile.OnTransitioned(x => Console.WriteLine(x.Trigger));
turnstile.Fire(Events.Coin); // mutates
How can I get it?