use crate::{ScriptLanguage, ScriptLanguageArr};
#[inline]
pub fn slangs_count_max(langs_cnt: &ScriptLanguageArr<u32>) -> u32 {
langs_cnt.iter().fold(1, |acc, &cnt| acc.max(cnt))
}
#[inline]
pub fn filter_max(
langs_cnt: ScriptLanguageArr<u32>,
) -> (impl Iterator<Item = ScriptLanguage> + Clone, u32) {
let lang_count_max = slangs_count_max(&langs_cnt);
(
langs_cnt
.into_iter()
.enumerate()
.filter(move |(_, cnt)| *cnt == lang_count_max)
.map(|(l, _)| unsafe { ScriptLanguage::transmute_from_usize(l) }),
lang_count_max,
)
}
#[inline]
pub fn filter_with_margin<const PERCENT: u32>(
langs_cnt: ScriptLanguageArr<u32>,
) -> (impl Iterator<Item = (ScriptLanguage, u32)> + Clone, u32) {
assert!(PERCENT < 100);
let langs_count_margin = slangs_count_max(&langs_cnt) * PERCENT / 100;
(
langs_cnt
.into_iter()
.enumerate()
.filter(move |(_, cnt)| *cnt > langs_count_margin)
.map(|(l, cnt)| (unsafe { ScriptLanguage::transmute_from_usize(l) }, cnt)),
langs_count_margin,
)
}
#[inline]
pub fn filter_with_margin_sorted<const PERCENT: u32>(
langs_cnt: ScriptLanguageArr<u32>,
) -> (Vec<(ScriptLanguage, u32)>, u32) {
let (iter, langs_count_margin) = filter_with_margin::<PERCENT>(langs_cnt);
let mut res: Vec<_> = iter.collect();
res.sort_unstable_by_key(|v| ::std::cmp::Reverse(v.1));
(res, langs_count_margin)
}