use std::{fmt::Debug, thread};
pub trait ConcurrencyExt {
fn get_optimal_cores(&self) -> usize {
thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(4)
}
fn get_chunk_size(&self, total_len: usize) -> usize {
(total_len / self.get_optimal_cores()).max(1)
}
}
impl<T> ConcurrencyExt for [T] {}
pub trait PrintWithSpaces {
fn print_with_spaces(&self, spaces: &str);
}
impl<T> PrintWithSpaces for [T]
where
T: Debug,
{
fn print_with_spaces(&self, spaces: &str) {
for item in self {
println!("{spaces}{item:?}");
}
}
}
pub trait FloatIterExt {
fn float_min(&mut self) -> f64;
fn float_max(&mut self) -> f64;
}
impl<T> FloatIterExt for T
where
T: Iterator<Item = f64>,
{
fn float_max(&mut self) -> f64 {
self.fold(f64::NAN, f64::max)
}
fn float_min(&mut self) -> f64 {
self.fold(f64::NAN, f64::min)
}
}
pub trait IntegerIterExt {
fn integer_min(&mut self) -> u32;
fn integer_max(&mut self) -> u32;
}
impl<T> IntegerIterExt for T
where
T: Iterator<Item = u32>,
{
fn integer_max(&mut self) -> u32 {
self.fold(u32::MIN, u32::max)
}
fn integer_min(&mut self) -> u32 {
self.fold(u32::MAX, u32::min)
}
}
pub trait Countable {
fn count_chars(&self) -> usize;
}
impl<T> Countable for T
where
T: ToString,
{
fn count_chars(&self) -> usize {
self.to_string().chars().count()
}
}
pub trait U8Extension {
fn to_usize(self) -> usize;
fn to_u64(self) -> u64;
}
impl U8Extension for u8 {
fn to_usize(self) -> usize {
Into::<usize>::into(self)
}
fn to_u64(self) -> u64 {
Into::<u64>::into(self)
}
}