use crate::*;
pub struct Store<T: 'static + Default> {
ctx: GeeseContextHandle<Self>,
dirty: bool,
value: T,
}
impl<T: Default> Store<T> {
fn reset_dirty(&mut self, _: &on::Changed<T>) {
self.dirty = false;
}
}
impl<T: Default> GeeseSystem for Store<T> {
const EVENT_HANDLERS: EventHandlers<Self> = event_handlers().with(Self::reset_dirty);
fn new(ctx: GeeseContextHandle<Self>) -> Self {
let dirty = false;
let value = T::default();
Self { ctx, dirty, value }
}
}
impl<T: Default> Deref for Store<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<T: Default> DerefMut for Store<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
if !self.dirty {
self.dirty = true;
self.ctx.raise_event(on::Changed::<T>::new());
}
&mut self.value
}
}
pub mod on {
use super::*;
pub struct Changed<T: 'static>(PhantomData<fn(T)>);
impl<T: 'static> Changed<T> {
pub(super) fn new() -> Self {
Self(PhantomData)
}
}
}