|
|
|
|
|
by Arnavion
2267 days ago
|
|
Rust will also support it one day, as part of the const generics feature. Partial support is there behind a feature flag. https://play.rust-lang.org/?version=nightly&mode=debug&editi... #![feature(const_generics)]
#[derive(PartialEq, Eq)] // enums used as const generics must be Eq
enum Color { Green, Yellow, Red }
struct State<const COLOR: Color>;
impl State<{ Color::Green }> { fn next(self) -> State<{ Color::Yellow }> { State } }
impl std::fmt::Debug for State<{ Color::Green }> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str("green") } }
impl State<{ Color::Yellow }> { fn next(self) -> State<{ Color::Red }> { State } }
impl std::fmt::Debug for State<{ Color::Yellow }> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str("yellow") } }
impl State<{ Color::Red }> { fn next(self) -> State<{ Color::Green }> { State } }
impl std::fmt::Debug for State<{ Color::Red }> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str("red") } }
impl State<{ Color::Green }> { fn new() -> Self { State } }
fn main() {
let state = dbg!(State::<{ Color::Green }>::new());
let state = dbg!(state.next());
let state = dbg!(state.next());
let state = dbg!(state.next());
}
Output: [src/main.rs:20] State::<{ Color::Green }>::new() = green
[src/main.rs:21] state.next() = yellow
[src/main.rs:22] state.next() = red
[src/main.rs:23] state.next() = green
|
|