1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*******************************************************************************
*
* Copyright (c) 2026 Haixing Hu.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0.
*
******************************************************************************/
//! # Qubit State Machine
//!
//! A small, thread-safe finite state machine for Rust.
//!
//! This crate is intentionally compact. It stores immutable transition rules
//! and applies events to an [`AtomicRef`] through a compare-and-swap executor.
//!
//! # Examples
//!
//! ```
//! use qubit_state_machine::{AtomicRef, StateMachine};
//!
//! #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
//! enum State {
//! New,
//! Running,
//! Done,
//! }
//!
//! #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
//! enum Event {
//! Start,
//! Finish,
//! }
//!
//! let machine = StateMachine::builder()
//! .add_states(&[State::New, State::Running, State::Done])
//! .set_initial_state(State::New)
//! .set_final_state(State::Done)
//! .add_transition(State::New, Event::Start, State::Running)
//! .add_transition(State::Running, Event::Finish, State::Done)
//! .build()
//! .expect("state machine should be valid");
//!
//! let state = AtomicRef::from_value(State::New);
//! assert_eq!(machine.trigger(&state, Event::Start).unwrap(), State::Running);
//! assert_eq!(*state.load(), State::Running);
//! ```
//!
pub use AtomicRef;
pub use StateMachine;
pub use StateMachineBuildError;
pub use StateMachineBuilder;
pub use ;
pub use Transition;