use cycle iter

This commit is contained in:
yggverse 2024-12-17 10:27:35 +02:00
parent 093ee87b1f
commit 8cf8d2b298
2 changed files with 8 additions and 55 deletions

View File

@ -1,17 +1,15 @@
mod back; mod back;
mod forward; mod forward;
mod iter;
use back::Back; use back::Back;
use forward::Forward; use forward::Forward;
use iter::Iter;
use super::Subject; use super::Subject;
use gtk::{ use gtk::{
prelude::{BoxExt, TextBufferExt, TextViewExt}, prelude::{BoxExt, TextBufferExt, TextViewExt},
Box, Orientation, TextIter, Box, Orientation, TextIter,
}; };
use std::cell::RefCell; use std::{cell::RefCell, iter::Cycle, vec::IntoIter};
const MARGIN: i32 = 6; const MARGIN: i32 = 6;
@ -19,7 +17,7 @@ pub struct Navigation {
pub back: Back, pub back: Back,
pub forward: Forward, pub forward: Forward,
pub g_box: Box, pub g_box: Box,
iter: RefCell<Option<Iter>>, iter: RefCell<Option<Cycle<IntoIter<(TextIter, TextIter)>>>>,
} }
impl Navigation { impl Navigation {
@ -56,7 +54,7 @@ impl Navigation {
pub fn update(&self, matches: Vec<(TextIter, TextIter)>) { pub fn update(&self, matches: Vec<(TextIter, TextIter)>) {
self.back.update(!matches.is_empty()); self.back.update(!matches.is_empty());
self.forward.update(!matches.is_empty()); self.forward.update(!matches.is_empty());
self.iter.replace(Some(Iter::new(matches))); self.iter.replace(Some(matches.into_iter().cycle()));
} }
pub fn back(&self, subject: &Subject) -> Option<(TextIter, TextIter)> { pub fn back(&self, subject: &Subject) -> Option<(TextIter, TextIter)> {
@ -69,15 +67,15 @@ impl Navigation {
); );
match self.iter.borrow_mut().as_mut() { match self.iter.borrow_mut().as_mut() {
Some(iter) => match iter.back() { Some(iter) => match iter.next() {
Some((start, end)) => { Some((start, end)) => {
buffer.apply_tag(&subject.tag.current, &start, &end); buffer.apply_tag(&subject.tag.current, &start, &end);
Some((start, end)) Some((start, end))
} }
None => iter.reset(), None => None,
}, },
None => todo!(), // unexpected None => todo!(), // unexpected
} } // @TODO reverse
} }
pub fn forward(&self, subject: &Subject) -> Option<(TextIter, TextIter)> { pub fn forward(&self, subject: &Subject) -> Option<(TextIter, TextIter)> {
@ -90,12 +88,12 @@ impl Navigation {
); );
match self.iter.borrow_mut().as_mut() { match self.iter.borrow_mut().as_mut() {
Some(iter) => match iter.forward() { Some(iter) => match iter.next() {
Some((start, end)) => { Some((start, end)) => {
buffer.apply_tag(&subject.tag.current, &start, &end); buffer.apply_tag(&subject.tag.current, &start, &end);
Some((start, end)) Some((start, end))
} }
None => iter.reset(), None => None,
}, },
None => todo!(), // unexpected None => todo!(), // unexpected
} }

View File

@ -1,45 +0,0 @@
use gtk::TextIter;
pub struct Iter {
value: Vec<(TextIter, TextIter)>,
index: Option<usize>,
}
impl Iter {
pub fn new(value: Vec<(TextIter, TextIter)>) -> Self {
Self { index: None, value }
}
pub fn back(&mut self) -> Option<(TextIter, TextIter)> {
self.index = match self.index {
Some(index) => {
if index > 0 {
Some(index - 1)
} else {
Some(self.value.len())
}
}
None => Some(self.value.len()), // init
};
self.value.get(self.index.unwrap_or_default()).copied()
}
pub fn forward(&mut self) -> Option<(TextIter, TextIter)> {
self.index = match self.index {
Some(index) => {
if index < self.value.len() {
Some(index + 1)
} else {
Some(0)
}
}
None => Some(0), // init
};
self.value.get(self.index.unwrap_or_default()).copied()
}
pub fn reset(&mut self) -> Option<(TextIter, TextIter)> {
self.index = None;
self.forward()
}
}