wip: generic render

This commit is contained in:
🪞👃🪞 2024-09-03 00:57:32 +03:00
parent 7bd2a70e85
commit fcd2d16de9
12 changed files with 314 additions and 351 deletions

View file

@ -1,45 +1,40 @@
use crate::*;
pub enum Collected<'a> {
Box(Box<dyn Render + 'a>),
Ref(&'a (dyn Render + 'a)),
None
pub enum Collected<'a, T, U> {
Box(Box<dyn Render<T, U> + 'a>),
Ref(&'a (dyn Render<T, U> + 'a)),
}
impl<'a> Render for Collected<'a> {
fn render (&self, buf: &mut Buffer, area: Rect) -> Usually<Rect> {
Ok(match self {
Self::Box(item) => (*item).render(buf, area)?,
Self::Ref(item) => (*item).render(buf, area)?,
Self::None => ().render(buf, area)?
})
impl<'a, T, U> Render<T, U> for Collected<'a, T, U> {
fn render (&self, to: &mut T) -> Perhaps<U> {
match self {
Self::Box(item) => (*item).render(to),
Self::Ref(item) => (*item).render(to),
}
}
}
pub struct Collection<'a>(pub Vec<Collected<'a>>);
impl<'a> Collection<'a> {
pub struct Collection<'a, T, U>(
pub Vec<Collected<'a, T, U>>
);
impl<'a, T, U> Collection<'a, T, U> {
pub fn new () -> Self {
Self(vec![])
}
}
pub trait Collect<'a> {
fn add_box (self, item: Box<dyn Render + 'a>) -> Self;
fn add_ref (self, item: &'a dyn Render) -> Self;
fn add <T: Render + Sized + 'a> (self, item: T) -> Self
pub trait Collect<'a, T, U> {
fn add_box (self, item: Box<dyn Render<T, U> + 'a>) -> Self;
fn add_ref (self, item: &'a dyn Render<T, U>) -> Self;
fn add <R: Render<T, U> + Sized + 'a> (self, item: R) -> Self
where Self: Sized
{
self.add_box(Box::new(item))
}
}
impl<'a> Collect<'a> for Collection<'a> {
fn add_box (mut self, item: Box<dyn Render + 'a>) -> Self {
impl<'a, T, U> Collect<'a, T, U> for Collection<'a, T, U> {
fn add_box (mut self, item: Box<dyn Render<T, U> + 'a>) -> Self {
self.0.push(Collected::Box(item));
self
}
fn add_ref (mut self, item: &'a dyn Render) -> Self {
fn add_ref (mut self, item: &'a dyn Render<T, U>) -> Self {
self.0.push(Collected::Ref(item));
self
}