use core::{slice, str};
#[must_use]
pub fn char_split_at(s: &str, mid: usize) -> Option<(&str, &str)> {
let mut iter = s.char_indices();
let mut last_char = (0, '\x00');
for _ in 0..mid {
last_char = iter.next()?;
}
let mid_index = last_char.0 + last_char.1.len_utf8();
Some(unsafe { (s.get_unchecked(..mid_index), s.get_unchecked(mid_index..)) })
}
#[must_use]
pub fn char_split_at_mut(s: &mut str, mid: usize) -> Option<(&mut str, &mut str)> {
let mut iter = s.char_indices();
let mut last_char = (0, '\x00');
for _ in 0..mid {
last_char = iter.next()?;
}
let mid_index = last_char.0 + last_char.1.len_utf8();
Some(unsafe {
(
str::from_utf8_unchecked_mut(slice::from_raw_parts_mut(s.as_mut_ptr(), mid_index)),
s.get_unchecked_mut(mid_index..),
)
})
}