2 个不稳定版本
0.2.0 | 2021 年 2 月 7 日 |
---|---|
0.1.0 | 2021 年 1 月 30 日 |
#1001 in 数据结构
26KB
341 行
statemachine-rs
一个零依赖项的库,用于实现状态机。
用法
让我们看看以下简单的例子。此示例显示状态机可以从给定的字符串(在此机中称为 current_state
)转换其数字,然后产生输出。
use statemachine_rs::machine::{builder::StateMachineBuilder, StateMachine};
fn main() {
let sm = StateMachineBuilder::start()
.initial_state(1)
.transition(|state, input| match (state, input) {
(1, "next") => 2,
(2, "next") => 3,
_ => unreachable!(),
})
.build()
.unwrap();
assert_eq!(1, sm.current_state());
sm.consume("next");
assert_eq!(2, sm.current_state());
}
您可以使用 statemachine_rs::machine::builder::StateMachineBuilder
来组装您的状态机。 StateMachineBuilder::initial_state()
初始化其机器的初始状态。 StateMachineBuilder::transition()
定义转换模型。
当然,我们可以使用 enum
来表示状态和输入。让我们看看另一个例子。
以下示例说明,如果您按下按钮,状态将变为 On
。否则,Off
。
use statemachine_rs::machine::{builder::StateMachineBuilder, StateMachine};
#[derive(Clone, Debug, PartialEq)]
enum ButtonState {
On,
Off,
}
enum Input {
Press,
}
fn main() {
let sm = StateMachineBuilder::start()
.initial_state(ButtonState::Off)
.transition(|state, input| match (state, input) {
(ButtonState::On, Input::Press) => ButtonState::Off,
(ButtonState::Off, Input::Press) => ButtonState::On,
})
.build()
.unwrap();
assert_eq!(ButtonState::Off, sm.current_state());
sm.consume(Input::Press);
assert_eq!(ButtonState::On, sm.current_state());
}
许可证
MIT
贡献
欢迎所有贡献。
如果您有改进此库的想法,请创建新的问题或提交新的拉取请求。
许可证:MIT