use std::borrow::Cow;
use unicode_segmentation::UnicodeSegmentation;
use unicode_width::UnicodeWidthStr;
#[inline(always)]
pub fn measure_text_width(s: &str) -> usize {
s.width()
}
pub fn split_line_by_delimiter(line: &str, delimiter: char) -> Vec<Cow<'_, str>> {
line.split(delimiter).map(Cow::Borrowed).collect()
}
pub fn split_long_word(allowed_width: usize, word: &str) -> (Cow<'_, str>, Cow<'_, str>) {
if word.bytes().all(|byte| (0x20..0x7f).contains(&byte)) {
let split_index = word.len().min(allowed_width);
let (parts, remaining) = word.split_at(split_index);
return (Cow::Borrowed(parts), Cow::Borrowed(remaining));
}
let mut current_width = 0;
let mut split_index = word.len();
for (index, c) in word.grapheme_indices(true) {
let character_width = c.width();
if (current_width + character_width) > allowed_width {
split_index = index;
break;
}
current_width += character_width;
}
let (parts, remaining) = word.split_at(split_index);
(Cow::Borrowed(parts), Cow::Borrowed(remaining))
}