mirror of
https://codeberg.org/unspeaker/tengri.git
synced 2025-12-06 11:46:42 +01:00
30 lines
816 B
Rust
30 lines
816 B
Rust
//use crate::*;
|
|
use std::sync::{Arc, RwLock};
|
|
|
|
#[derive(Debug, Default)] pub struct Memo<T, U> {
|
|
pub value: T,
|
|
pub view: Arc<RwLock<U>>
|
|
}
|
|
|
|
impl<T: PartialEq, U> Memo<T, U> {
|
|
pub fn new (value: T, view: U) -> Self {
|
|
Self { value, view: Arc::new(view.into()) }
|
|
}
|
|
pub fn update <R> (
|
|
&mut self,
|
|
newval: T,
|
|
render: impl Fn(&mut U, &T, &T)->R
|
|
) -> Option<R> {
|
|
if newval != self.value {
|
|
let result = render(&mut*self.view.write().unwrap(), &newval, &self.value);
|
|
self.value = newval;
|
|
return Some(result);
|
|
}
|
|
None
|
|
}
|
|
}
|
|
|
|
/// Clear a pre-allocated buffer, then write into it.
|
|
#[macro_export] macro_rules! rewrite {
|
|
($buf:ident, $($rest:tt)*) => { |$buf,_,_|{ $buf.clear(); write!($buf, $($rest)*) } }
|
|
}
|