use crate::prelude::*;
pub trait WritableUtils<T: 'static> {
fn write_state(&mut self) -> WriteRef<'static, T>;
fn peek_state(&self) -> ReadRef<'static, T>;
fn set(&mut self, value: T) {
*self.write_state() = value;
}
fn set_if_modified(&mut self, value: T)
where
T: PartialEq,
{
if *self.peek_state() != value {
self.set(value);
}
}
fn set_if_modified_and_then(&mut self, value: T, then: impl FnOnce())
where
T: PartialEq,
{
if *self.peek_state() != value {
self.set(value);
then();
}
}
fn with_mut(&mut self, with: impl FnOnce(WriteRef<'static, T>)) {
with(self.write_state());
}
}
impl<T: 'static> WritableUtils<T> for State<T> {
fn write_state(&mut self) -> WriteRef<'static, T> {
self.write()
}
fn peek_state(&self) -> ReadRef<'static, T> {
self.peek()
}
}
impl<T: 'static> WritableUtils<T> for Writable<T> {
fn write_state(&mut self) -> WriteRef<'static, T> {
self.write()
}
fn peek_state(&self) -> ReadRef<'static, T> {
self.peek()
}
}