hvm-core 0.2.26

HVM-Core is a massively parallel Interaction Combinator evaluator.
use crate::prelude::*;

use crate::run::Rewrites;
use core::{str, time::Duration};

pub fn show_rewrites(rwts: &Rewrites) -> String {
  format!(
    "{}{}{}{}{}{}",
    format_args!("RWTS   : {:>15}\n", pretty_num(rwts.total())),
    format_args!("- ANNI : {:>15}\n", pretty_num(rwts.anni)),
    format_args!("- COMM : {:>15}\n", pretty_num(rwts.comm)),
    format_args!("- ERAS : {:>15}\n", pretty_num(rwts.eras)),
    format_args!("- DREF : {:>15}\n", pretty_num(rwts.dref)),
    format_args!("- OPER : {:>15}\n", pretty_num(rwts.oper)),
  )
}

pub fn show_stats(rwts: &Rewrites, elapsed: Duration) -> String {
  format!(
    "{}{}{}",
    show_rewrites(rwts),
    format_args!("TIME   : {:.3?}\n", elapsed),
    format_args!("RPS    : {:.3} M\n", (rwts.total() as f64) / (elapsed.as_millis() as f64) / 1000.0),
  )
}

#[rustfmt::skip] // utterly unreadable on one line
fn pretty_num(n: u64) -> String {
  n.to_string()
    .as_bytes()
    .rchunks(3)
    .rev()
    .map(|x| str::from_utf8(x).unwrap())
    .flat_map(|x| ["_", x])
    .skip(1)
    .collect()
}