fluent-machine
v0.1.11
Published
Spec compliant state machines using JSX, XML or JSON and chainable methods
Downloads
1
Maintainers
Readme
Fluent machine
Spec compliant state machines using JSX, SCXML or JSON and chainable methods.
Example:
import fsm from "fluent-machine";
// Define state chart using JSX
const humanStateChart = (
<>
<State initial id="sleeping">
<Transition event="walk" target="walking" />
</State>
<State id="walking">
<Transition event="sleep" target="sleeping" />
<Transition event="run" target="running" />
</State>
<State initial id="running">
<Transition event="walk" target="walking" />
</State>
</>
);
const context = {
energy: 10,
speed: 0,
};
// Create a machine (also supports SCXML or Xstate JSON)
const humanMachine = fsm(humanStateChart, context);
// Add conditions, assignments or invoke side effects with chained syntax
humanMachine
.when({
state: "walking",
event: "run",
})
.cond((context) => {
return context.energy > 5;
})
.assign((context) => ({
energy: context.energy--,
speed: 10,
}));
humanMachine
.when({
state: "sleeping",
})
.assign((context) => ({
energy: context.energy++,
speed: 0,
}));
// Start machine
export const service = humanMachine.start();
Features
| SCXML specification | flux-machine | | ------------------- | :--------------: | | scxml | ✅ | | state | ✅ | | parallel | ❌ | | transition | ✅ | | initial | ❌ | | final | ❌ | | onentry | ❌ | | onexit | ❌ | | history | ❌ | | raise | ❌ | | if | ❌ | | elseif | ❌ | | else | ❌ | | foreach | ❌ | | log | ❌ | | datamodel | ✅ | | data | ✅ | | assign | ✅ | | donedata | ❌ | | content | ❌ | | param | ❌ | | script | ❌ | | send | ✅ | | cancel | ❌ | | invoke | ✅ | | finalize | ❌ |
FAQ
Should I use this in production?
- No, not until it reaches V1.0.0
- It's an experiment that I coded in a weekend it and only supports the conditions in
src/tests/fsm.test.tsx