#[allow(dead_code)]
pub fn prev_char_boundary(s: &str, byte_pos: usize) -> usize {
if byte_pos == 0 {
return 0;
}
let mut p = byte_pos - 1;
while !s.is_char_boundary(p) {
p -= 1;
}
p
}
#[allow(dead_code)]
pub fn next_char_boundary(s: &str, byte_pos: usize) -> usize {
if byte_pos >= s.len() {
return s.len();
}
let mut p = byte_pos + 1;
while p < s.len() && !s.is_char_boundary(p) {
p += 1;
}
p
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn prev_at_zero_stays_zero() {
assert_eq!(prev_char_boundary("abc", 0), 0);
}
#[test]
fn next_at_end_stays_end() {
let s = "abc";
assert_eq!(next_char_boundary(s, s.len()), s.len());
}
#[test]
fn handles_multibyte() {
let s = "é";
assert_eq!(prev_char_boundary(s, s.len()), 0);
assert_eq!(next_char_boundary(s, 0), s.len());
}
}