termint 0.8.1

Library for colored printing and Terminal User Interfaces
Documentation
use std::{cell::RefCell, rc::Rc};

use criterion::{Criterion, black_box, criterion_group};
use termint::{
    buffer::Buffer,
    geometry::{Rect, Unit},
    widgets::{Element, LayoutNode, Row, Table, TableState, Widget},
};

fn table_cache_render(c: &mut Criterion) {
    let state = Rc::new(RefCell::new(
        TableState::new(0).selected(0).selected_column(0),
    ));
    let table = Table::new(
        get_data(),
        vec![Unit::Length(4), Unit::Percent(40), Unit::Fill(1)],
        state,
    );

    let rect = Rect::new(1, 1, 101, 101);
    let buffer = Buffer::empty(rect);

    let grid: Element = table.into();
    let mut node = LayoutNode::new(&grid);
    grid.render(&mut buffer.clone(), &node);

    c.bench_function("table_cache_render", |b| {
        b.iter(|| {
            node.diff(&grid, &grid);
            grid.render(black_box(&mut buffer.clone()), black_box(&node));
        });
    });
}

fn table_no_cache_render(c: &mut Criterion) {
    let state = Rc::new(RefCell::new(
        TableState::new(0).selected(0).selected_column(0),
    ));
    let table = Table::new(
        get_data(),
        vec![Unit::Length(4), Unit::Percent(40), Unit::Fill(1)],
        state,
    );

    let rect = Rect::new(1, 1, 101, 101);
    let buffer = Buffer::empty(rect);

    let grid: Element = table.into();
    c.bench_function("table_no_cache_render", |b| {
        b.iter(|| {
            let node = LayoutNode::new(&grid);
            grid.render(black_box(&mut buffer.clone()), black_box(&node));
        });
    });
}

fn get_data() -> Vec<Row<()>> {
    let mut rows = vec![];
    for i in 0..100 {
        rows.push(Row::new(vec![
            format!("{}", i),
            format!("Value {}", i * 2),
            format!("Description {}", i * 3),
        ]));
    }
    rows
}

criterion_group!(benches, table_cache_render, table_no_cache_render);