pub trait State {
fn chain(&self) -> Vec<&'static str>;
fn link<'valid>(&'valid mut self) -> &'valid mut Vec<&'static str>;
}
pub trait DerivedState<'valid>: State + From<&'valid mut dyn State> {}
pub struct Main {
pub chain: Vec<&'static str> = Vec::new()
}
impl State for Main {
fn chain(&self) -> Vec<&'static str> {return self.chain.clone()}
fn link<'valid>(&'valid mut self) -> &'valid mut Vec<&'static str> {return &mut self.chain}
}
pub struct Stay<'this> {
link: &'this mut Vec<&'static str>
}
impl<'this> State for Stay<'this> {
fn chain(&self) -> Vec<&'static str> {return self.link.clone()}
fn link<'valid>(&'valid mut self) -> &'valid mut Vec<&'static str> {return self.link}
}
impl<'valid> DerivedState<'valid> for Stay<'valid> {}
impl<'valid> From<&'valid mut (dyn State + 'valid)> for Stay<'valid> {
fn from(value: &'valid mut (dyn State + 'valid)) -> Self {return Self {
link: value.link()
}}
}
pub struct Add<'valid, const NAME: &'static str> {
link: &'valid mut Vec<&'static str>
}
impl<'this, const NAME: &'static str> State for Add<'this, NAME> {
fn chain(&self) -> Vec<&'static str> {return self.link.clone()}
fn link<'valid>(&'valid mut self) -> &'valid mut Vec<&'static str> {return self.link}
}
impl<'valid, const NAME: &'static str> Drop for Add<'valid, NAME> {
fn drop(&mut self) {self.link.pop();}
}
impl<'valid, const NAME: &'static str> DerivedState<'valid> for Add<'valid, NAME> {}
impl<'valid, const NAME: &'static str> From<&'valid mut (dyn State + 'valid)> for Add<'valid, NAME> {
fn from(value: &'valid mut (dyn State + 'valid)) -> Self {
value.link().push(NAME);
return Self {
link: value.link()
}
}
}