-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Noah Crowley
committed
Nov 3, 2023
1 parent
bb41155
commit ff42710
Showing
1 changed file
with
53 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -26,7 +26,7 @@ npm i @rbxts/finite-state-machine | |
### Wally | ||
[Wally](https://github.com/UpliftGames/wally/) users can install this package by adding the following line to their `Wally.toml` under `[dependencies]`: | ||
``` | ||
FiniteStateMachine = "bytebit/[email protected].8" | ||
FiniteStateMachine = "bytebit/[email protected].9" | ||
``` | ||
|
||
Then just run `wally install`. | ||
|
@@ -38,4 +38,55 @@ Model files are uploaded to every release as `.rbxmx` files. You can download th | |
New versions of the asset are uploaded with every release. The asset can be added to your Roblox Inventory and then inserted into your Place via Toolbox by getting it [here.](https://www.roblox.com/library/7872552904/Finite-State-Machine-Package) | ||
|
||
## Documentation | ||
TODO | ||
|
||
### IReadonlyFiniteStateMachine interface | ||
This interface is meant to be used when there is a consumer that merely cares about the state of the machine but not to do anything to affect that state. | ||
|
||
It requires two generic inputs - a `StateType` and an `EventType`. Both must simply fit the type `defined`. | ||
|
||
#### stateChanged Signal | ||
`readonly stateChanged: IReadOnlySignal<(newState: StateType, oldState: StateType, event: EventType) => void>;` | ||
|
||
Fired when the current state is changed by an event. | ||
|
||
#### getCurrentState Method | ||
`getCurrentState(): StateType;` | ||
|
||
Used to get the current state of the machine. | ||
|
||
### FiniteStateMachine class | ||
|
||
_Implements everything from `IReadonlyFiniteStateMachine`._ | ||
|
||
This is the root of this package. | ||
|
||
#### Construction | ||
In order to construct a `FiniteStateMachine` instance, you will need to define your states, events, and the transition relationships between them. | ||
|
||
Take this on/off switch as an example: | ||
```ts | ||
type StateType = "On" | "Off"; | ||
type EventType = "Toggle"; | ||
const stateTransitions = new Map<[StateType, EventType], StateType>([ | ||
[["Off", "Toggle"], "On"], | ||
[["On", "Toggle"], "Off"] | ||
]); | ||
const fsm = FiniteStateMachine.create("Off", stateTransitions); | ||
``` | ||
|
||
#### destroy Method | ||
`destroy(): void` | ||
|
||
This method is used to destroy an instance. That instance will throw exceptions if any other methods are used after this is invoked. | ||
|
||
#### handleEvent Method | ||
`handleEvent(event: EventType): void` | ||
|
||
This method is used to effect a state transition though an event. If the given event has a valid state to transition to from the current state as per the state transitions at the time of the instance's construction, the state will be changed accordingly; otherwise, an error will be raised. | ||
|
||
Example using the on/off switch from above: | ||
```ts | ||
function toggleSwitch() { | ||
fsm.handleEvent("Toggle"); | ||
} | ||
``` |