//use crate::*; use std::sync::{Arc, RwLock}; #[derive(Debug, Default)] pub struct Memo { pub value: T, pub view: Arc> } impl Memo { pub fn new (value: T, view: U) -> Self { Self { value, view: Arc::new(view.into()) } } pub fn update ( &mut self, newval: T, render: impl Fn(&mut U, &T, &T)->R ) -> Option { 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)*) } } }