use crate::state::RawState;
pub trait Stated {
type Item: RawState;
private!();
fn into_inner(self) -> Self::Item;
fn get(&self) -> &Self::Item;
fn get_mut(&mut self) -> &mut Self::Item;
fn set(&mut self, inner: Self::Item) -> &mut Self {
*self.get_mut() = inner;
self
}
fn replace(&mut self, inner: Self::Item) -> Self::Item {
core::mem::replace(self.get_mut(), inner)
}
fn swap(&mut self, other: &mut Self) {
core::mem::swap(self.get_mut(), other.get_mut())
}
fn take(&mut self) -> Self::Item
where
Self::Item: Default,
{
core::mem::take(self.get_mut())
}
}
macro_rules! stated {
(@impl $state:ident($($field:tt)*)) => {
impl<Q> $crate::state::Stated for $crate::state::$state<Q>
where
Q: $crate::state::RawState,
{
type Item = Q;
seal!();
fn into_inner(self) -> Q {
self.$($field)*
}
fn get(&self) -> &Q {
&self.$($field)*
}
fn get_mut(&mut self) -> &mut Q {
&mut self.$($field)*
}
}
};
($($T:ident($($field:tt)*)),* $(,)?) => {
$(
stated!(@impl $T($($field)*));
)*
};
}
stated! {
State(0),
}