@@ -0,0 +1,69 @@
3+pub fn find_nth_next(text: RopeSlice, ch: char, pos: usize, n: usize) -> Option<usize> {
4+ // start searching right after pos
5+ let mut byte_idx = text.char_to_byte(pos + 1);
7+ let (mut chunks, mut chunk_byte_idx, _chunk_char_idx, _chunk_line_idx) =
8+ text.chunks_at_byte(byte_idx);
10+ let mut chunk = chunks.next().unwrap_or("");
12+ chunk = &chunk[(byte_idx - chunk_byte_idx)..];
16+ match chunk.find(ch) {
19+ chunk = &chunk[pos + 1..];
22+ None => match chunks.next() {
23+ Some(next_chunk) => {
24+ byte_idx += chunk.len();
28+ log::info!("no more chunks");
35+ Some(text.byte_to_char(byte_idx))
38+pub fn find_nth_prev(text: RopeSlice, ch: char, pos: usize, n: usize) -> Option<usize> {
39+ // start searching right before pos
40+ let mut byte_idx = text.char_to_byte(pos.saturating_sub(1));
42+ let (mut chunks, mut chunk_byte_idx, _chunk_char_idx, _chunk_line_idx) =
43+ text.chunks_at_byte(byte_idx);
45+ let mut chunk = chunks.prev().unwrap_or("");
47+ // start searching from pos
48+ chunk = &chunk[..=byte_idx - chunk_byte_idx];
52+ match chunk.rfind(ch) {
54+ byte_idx = chunk_byte_idx + pos;
55+ chunk = &chunk[..pos];
58+ None => match chunks.prev() {
59+ Some(prev_chunk) => {
60+ chunk_byte_idx -= chunk.len();
68+ Some(text.byte_to_char(byte_idx))