sp1_core_executor/events/
utils.rsuse serde::Deserialize;
use serde::Serialize;
use std::{
fmt::Display,
iter::{Map, Peekable},
};
use rand::{thread_rng, Rng};
#[derive(Deserialize, Serialize, Debug, Clone, Copy, Default, Eq, Hash, PartialEq)]
pub struct LookupId {
pub a: u32,
pub b: u32,
pub c: u32,
pub d: u32,
}
#[must_use]
pub fn create_alu_lookup_id() -> LookupId {
let mut rng = thread_rng();
LookupId { a: rng.gen(), b: rng.gen(), c: rng.gen(), d: rng.gen() }
}
#[must_use]
pub fn create_alu_lookups() -> [LookupId; 6] {
let mut rng = thread_rng();
[
LookupId { a: rng.gen(), b: rng.gen(), c: rng.gen(), d: rng.gen() },
LookupId { a: rng.gen(), b: rng.gen(), c: rng.gen(), d: rng.gen() },
LookupId { a: rng.gen(), b: rng.gen(), c: rng.gen(), d: rng.gen() },
LookupId { a: rng.gen(), b: rng.gen(), c: rng.gen(), d: rng.gen() },
LookupId { a: rng.gen(), b: rng.gen(), c: rng.gen(), d: rng.gen() },
LookupId { a: rng.gen(), b: rng.gen(), c: rng.gen(), d: rng.gen() },
]
}
#[allow(clippy::type_complexity)]
pub fn sorted_table_lines<'a, K, V>(
table: impl IntoIterator<Item = (K, V)> + 'a,
) -> Map<
Peekable<Map<std::vec::IntoIter<(K, V)>, impl FnMut((K, V)) -> (String, String)>>,
impl FnMut((String, String)) -> String,
>
where
K: Ord + Display + 'a,
V: Ord + Display + 'a,
{
let mut entries = table.into_iter().collect::<Vec<_>>();
entries.sort_unstable_by(|a, b| a.1.cmp(&b.1).reverse().then_with(|| a.0.cmp(&b.0)));
let mut table_with_string_counts = entries
.into_iter()
.map(|(label, ct)| (label.to_string().to_lowercase(), ct.to_string()))
.peekable();
let width = table_with_string_counts.peek().map(|(_, b)| b.len()).unwrap_or_default();
table_with_string_counts.map(move |(label, count)| format!("{count:>width$} {label}"))
}