use crate::*; /// Lazily-evaluated [Draw]able. pub struct Lazy(PhantomData<(E, T)>, F); impl + Layout, F: Fn()->T> Lazy { pub const fn new (thunk: F) -> Self { Self(PhantomData, thunk) } } impl + Layout, F: Fn()->T> Content for Lazy { fn content (&self) -> impl Draw + Layout + '_ { (self.1)() } } pub struct Thunk(PhantomData, F); impl Thunk { pub const fn new (draw: F) -> Self { Self(PhantomData, draw) } } impl Draw for Thunk { fn draw (&self, to: &mut E) { (self.1)(to) } } impl Layout for Thunk { fn layout (&self, to: E::Area) -> E::Area { to } } #[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, draw: impl Fn(&mut U, &T, &T)->R ) -> Option { if newval != self.value { let result = draw(&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)*) } } }