cranpose-ui 0.9.21

Composable widgets, text, layouts and input for Cranpose apps
Documentation
use std::{hint::black_box, time::Duration};

use cranpose_core::{Composition, MemoryApplier};
use cranpose_ui::{
    AppContext, Catalog, Locale, Modifier, ProvideLocalization, Text, TextStyle, composable,
    localization::Resource, tr,
};
use criterion::{Criterion, criterion_group, criterion_main};

#[composable(no_skip)]
fn Label(localized: bool, count: u32) {
    if localized {
        Text(
            tr!("Files: {count}", id = "files", count = count),
            Modifier::empty(),
            TextStyle::default(),
        );
    } else {
        Text(
            format!("Files: {count}"),
            Modifier::empty(),
            TextStyle::default(),
        );
    }
}

fn benchmark(c: &mut Criterion) {
    let context = AppContext::new();
    context.enter(|| {
        let catalog = Catalog::from_resources(
            "en",
            &[
                Resource {
                    locale: "en",
                    namespace: "cranpose-ui",
                    source: "files = Files: { $count }",
                },
                Resource {
                    locale: "fr",
                    namespace: "cranpose-ui",
                    source: "files = Fichiers : { $count }",
                },
            ],
        )
        .expect("catalog");
        let locales = [
            Locale::parse("en").expect("English"),
            Locale::parse("fr").expect("French"),
        ];
        let mut group = c.benchmark_group("localization");
        group
            .sample_size(20)
            .measurement_time(Duration::from_secs(2));
        for (name, localized, change_count, change_locale) in [
            ("plain", false, false, false),
            ("unchanged", true, false, false),
            ("arguments", true, true, false),
            ("language", true, false, true),
        ] {
            let mut composition = Composition::new(MemoryApplier::new());
            let mut iteration = 0u32;
            let mut render = || {
                iteration = iteration.wrapping_add(1);
                let count = if change_count { iteration } else { 2 };
                let language = if change_locale {
                    iteration as usize % 2
                } else {
                    0
                };
                composition
                    .render(17, || {
                        ProvideLocalization(&catalog, locales[language].clone(), || {
                            Label(localized, black_box(count));
                        });
                    })
                    .expect("render");
            };
            render();
            group.bench_function(name, |b| b.iter(&mut render));
        }
        group.finish();
    });
}

criterion_group!(benches, benchmark);
criterion_main!(benches);