https://github.com/yglukhov/state_machine
State machine
https://github.com/yglukhov/state_machine
Last synced: 3 months ago
JSON representation
State machine
- Host: GitHub
- URL: https://github.com/yglukhov/state_machine
- Owner: yglukhov
- License: mit
- Created: 2017-08-08T20:50:48.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2019-11-07T06:28:16.000Z (almost 6 years ago)
- Last Synced: 2024-10-14T15:04:38.199Z (12 months ago)
- Language: Nim
- Size: 3.91 KB
- Stars: 6
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# state_machine [](https://travis-ci.org/yglukhov/state_machine)
Simple configurable state machine implementation# Usage
```nim
import state_machinetype
CarEvent = enum
park
ignite
idle
shift_up
shift_down
crash
repairCarState = enum
parked
idling
first_gear
second_gear
third_gear
stalled# Setup
var sm: StateMechine[CarState, CarEvent]
sm.init()# Define possible transitions
sm.transition(park, {idling, first_gear}, parked)sm.transition(ignite, stalled, stalled)
sm.transition(ignite, parked, idling)sm.transition(idle, first_gear, idling)
sm.transition(shift_up, idling, first_gear)
sm.transition(shift_up, first_gear, second_gear)
sm.transition(shift_up, second_gear, third_gear)sm.transition(shift_down, third_gear, second_gear)
sm.transition(shift_down, second_gear, first_gear)# Setup transition handlers
sm.afterTransition(first_gear, {second_gear}) do():
echo "first -> second: "sm.afterTransition(CarState.all, first_gear) do(f, t: CarState, e: CarEvent):
echo "-> first"# Use
sm.event(ignite)
doAssert(sm.state == idling)sm.event(shift_up)
doAssert(sm.state == first_gear)sm.event(shift_up)
doAssert(sm.state == second_gear)
echo sm.state
sm.event(shift_down)
doAssert(sm.state == first_gear)doAssert(not sm.tryEvent(repair))
```