mirror of
https://codeberg.org/unspeaker/tengri.git
synced 2025-12-06 19:56:44 +01:00
74 lines
2.2 KiB
Rust
74 lines
2.2 KiB
Rust
use crate::*;
|
|
use std::marker::PhantomData;
|
|
|
|
/// Lazily-evaluated [Render]able.
|
|
pub struct Thunk<E: Output, T: Render<E>, F: Fn()->T + Send + Sync>(
|
|
PhantomData<E>,
|
|
F
|
|
);
|
|
impl<E: Output, T: Render<E>, F: Fn()->T + Send + Sync> Thunk<E, T, F> {
|
|
pub const fn new (thunk: F) -> Self {
|
|
Self(PhantomData, thunk)
|
|
}
|
|
}
|
|
impl<E: Output, T: Render<E>, F: Fn()->T + Send + Sync> Content<E> for Thunk<E, T, F> {
|
|
fn content (&self) -> impl Render<E> { (self.1)() }
|
|
}
|
|
|
|
pub struct ThunkBox<'a, E: Output>(
|
|
PhantomData<E>,
|
|
Box<dyn Fn()->RenderBox<'a, E> + Send + Sync + 'a>
|
|
);
|
|
impl<'a, E: Output> ThunkBox<'a, E> {
|
|
pub const fn new (thunk: Box<dyn Fn()->RenderBox<'a, E> + Send + Sync + 'a>) -> Self {
|
|
Self(PhantomData, thunk)
|
|
}
|
|
}
|
|
impl<'a, E: Output> Content<E> for ThunkBox<'a, E> {
|
|
fn content (&self) -> impl Render<E> { (self.1)() }
|
|
}
|
|
impl<'a, E, F, T> From<F> for ThunkBox<'a, E>
|
|
where
|
|
E: Output,
|
|
F: Fn()->T + Send + Sync + 'a,
|
|
T: Render<E> + Send + Sync + 'a
|
|
{
|
|
fn from (f: F) -> Self {
|
|
Self(PhantomData, Box::new(move||f().boxed()))
|
|
}
|
|
}
|
|
//impl<'a, E: Output, F: Fn()->Box<dyn Render<E> + 'a> + Send + Sync + 'a> From<F> for ThunkBox<'a, E> {
|
|
//fn from (f: F) -> Self {
|
|
//Self(Default::default(), Box::new(f))
|
|
//}
|
|
//}
|
|
|
|
pub struct ThunkRender<E: Output, F: Fn(&mut E) + Send + Sync>(PhantomData<E>, F);
|
|
impl<E: Output, F: Fn(&mut E) + Send + Sync> ThunkRender<E, F> {
|
|
pub fn new (render: F) -> Self { Self(PhantomData, render) }
|
|
}
|
|
impl<E: Output, F: Fn(&mut E) + Send + Sync> Content<E> for ThunkRender<E, F> {
|
|
fn render (&self, to: &mut E) { (self.1)(to) }
|
|
}
|
|
|
|
pub struct ThunkLayout<
|
|
E: Output,
|
|
F1: Fn(E::Area)->E::Area + Send + Sync,
|
|
F2: Fn(&mut E) + Send + Sync
|
|
>(
|
|
PhantomData<E>,
|
|
F1,
|
|
F2
|
|
);
|
|
impl<E: Output, F1: Fn(E::Area)->E::Area + Send + Sync, F2: Fn(&mut E) + Send + Sync> ThunkLayout<E, F1, F2> {
|
|
pub fn new (layout: F1, render: F2) -> Self { Self(PhantomData, layout, render) }
|
|
}
|
|
impl<E, F1, F2> Content<E> for ThunkLayout<E, F1, F2>
|
|
where
|
|
E: Output,
|
|
F1: Fn(E::Area)->E::Area + Send + Sync,
|
|
F2: Fn(&mut E) + Send + Sync
|
|
{
|
|
fn layout (&self, to: E::Area) -> E::Area { (self.1)(to) }
|
|
fn render (&self, to: &mut E) { (self.2)(to) }
|
|
}
|