lineshapes 0.1.0

Fast composable optical-constant models: analytic Kramers-Kronig-paired lineshape peaks (Gaussian, Lorentzian, Voigt, pseudo-Voigt) plus a continuum.
Documentation
use lineshapes::Model;
use std::time::Instant;
fn bench(name: &str, m: &Model, e: &[f64]) {
    let mut out = m.eval(e);
    let reps = 3000;
    let t = Instant::now();
    for _ in 0..reps {
        m.eval_into(e, &mut out);
    }
    println!(
        "{name:10} {:.2} ns/pt  ({:.1} us)",
        t.elapsed().as_nanos() as f64 / (e.len() * reps) as f64,
        t.elapsed().as_nanos() as f64 / reps as f64 / 1e3
    );
    std::hint::black_box(&out);
}
fn main() {
    let e: Vec<f64> = (0..4001).map(|i| 900.0 + i as f64 * 0.025).collect();
    bench("empty", &Model::new(), &e);
    bench("gaussian", &Model::new().gaussian(930.0, 1.0, 1.0), &e);
    bench("lorentz", &Model::new().lorentzian(930.0, 0.5, 1.0), &e);
    bench("voigt", &Model::new().voigt(930.0, 0.5, 0.3, 1.0), &e);
    bench("step", &Model::new().step(930.0, 6.0, 1.0, 0.0), &e);
    bench("table", &Model::new().delta_table(&e, &e), &e);
}