use std::{fmt::Debug, marker::PhantomData};
fn main() {
let mut wrapper = Wrapper::<usize> {
value: Token::<i32>(PhantomData),
_marker: PhantomData,
game_state: GameState::Idle,
};
let token: &mut Token<i32> = wrapper.token_mut();
let token: &Token<i32> = wrapper.token();
let game_state: &GameState = wrapper.game_state();
let game_state_mut: &mut GameState = wrapper.game_state_mut();
}
struct Wrapper<T: Default>
where
T: Debug,
{
value: Token<i32>,
game_state: GameState,
_marker: PhantomData<T>,
}
impl<T: Default> TokenHolder<i32> for Wrapper<T>
where
T: Debug,
{
fn token(&self) -> &Token<i32> {
&self.value
}
fn token_mut(&mut self) -> &mut Token<i32> {
&mut self.value
}
}
impl<T: Default> GameStateHolder for Wrapper<T>
where
T: Debug,
{
fn game_state<'a: 'b, 'b>(&'a self) -> &'b GameState {
&self.game_state
}
fn game_state_mut(&mut self) -> &mut GameState {
&mut self.game_state
}
}
struct Token<T: Default>(PhantomData<T>)
where
T: Debug;
trait TokenHolder<T: Default>
where
T: Debug,
{
fn token(&self) -> &Token<T>;
fn token_mut(&mut self) -> &mut Token<T>;
}
enum GameState {
Idle,
Play,
}
trait GameStateHolder {
fn game_state<'a: 'b, 'b>(&'a self) -> &'b GameState;
fn game_state_mut(&mut self) -> &mut GameState;
}