git-record 0.3.0

UI component to interactively select changes to include in a commit.
Documentation
use std::{borrow::Cow, convert::Infallible, path::PathBuf};

use criterion::{criterion_group, criterion_main, BatchSize, Criterion};

use cursive::CursiveRunnable;
use git_record::{
    testing::{CursiveTestingBackend, CursiveTestingEvent},
    FileState, RecordState, Recorder, Section, SectionChangedLine,
};

fn bench_record(c: &mut Criterion) {
    c.bench_function("toggle line", |b| {
        let before_line = SectionChangedLine {
            is_selected: false,
            line: Cow::Borrowed("foo\n"),
        };
        let after_line = SectionChangedLine {
            is_selected: false,
            line: Cow::Borrowed("foo\n"),
        };
        let file_states = vec![(
            PathBuf::from("foo"),
            FileState {
                file_mode: None,
                sections: vec![Section::Changed {
                    before: vec![before_line; 1000],
                    after: vec![after_line; 1000],
                }],
            },
        )];
        let record_state = RecordState { file_states };
        b.iter_batched(
            || {
                let siv = CursiveRunnable::new::<Infallible, _>(move || {
                    Ok(CursiveTestingBackend::init(vec![
                        CursiveTestingEvent::Event(' '.into()),
                        CursiveTestingEvent::Event(' '.into()),
                        CursiveTestingEvent::Event('q'.into()),
                    ]))
                });
                let siv = siv.into_runner();
                let recorder = Recorder::new(record_state.clone());
                (recorder, siv)
            },
            |(recorder, siv)| recorder.run(siv),
            BatchSize::PerIteration,
        )
    });
}

criterion_group!(
    name = benches;
    config = Criterion::default().sample_size(10);
    targets = bench_record,
);
criterion_main!(benches);