pub fn is_displayable_ascii(c: char) -> bool {
c.is_ascii() && !c.is_ascii_control()
}
pub fn is_hiragana(c: char) -> bool {
matches!(c,'\u{3041}'..='\u{308f}' | '\u{3092}'..='\u{3094}')
}
pub fn is_japanese_symbol(c: char) -> bool {
matches!(c,
'\u{2019}' | '\u{201d}' |
'\u{3000}'..='\u{3002}' |
'\u{300c}'..='\u{300d}' |
'\u{301c}' |
'\u{30fb}'..='\u{30fc}' |
'\u{ff01}' |
'\u{ff03}'..='\u{ff06}' |
'\u{ff08}'..='\u{ff0b}' |
'\u{ff0f}' |
'\u{ff1a}'..='\u{ff20}' |
'\u{ff3e}'..='\u{ff40}' |
'\u{ff5b}'..='\u{ff5d}' |
'\u{ffe5}'
)
}
pub(crate) fn calc_ceil_div(a: usize, b: usize) -> usize {
(a + b - 1) / b
}
pub(crate) fn convert_by_weighted_count(
from_count: usize,
to_count: usize,
from_delta: usize,
) -> usize {
calc_ceil_div(from_delta * to_count, from_count)
}