A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/text/manipulations.rs')
-rw-r--r--src/text/manipulations.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/text/manipulations.rs b/src/text/manipulations.rs
new file mode 100644
index 0000000..c1be175
--- /dev/null
+++ b/src/text/manipulations.rs
@@ -0,0 +1,78 @@
+use std::mem::take;
+
+use crate::sni::{Snippet, StopP};
+use crate::text::cursor::Cursors;
+#[derive(Clone, Debug)]
+pub enum Manip {
+ Removed(usize /* usize */),
+ Moved(usize),
+ Unmoved(usize),
+}
+use Manip::*;
+use ttools::IteratorOfTuplesWithF;
+impl Manip {
+ pub fn kept(self) -> Option<usize> {
+ match self {
+ Self::Removed(..) => None,
+ Self::Moved(x) => Some(x),
+ Self::Unmoved(x) => Some(x),
+ }
+ }
+ pub fn unwrap(self) -> usize {
+ let (Removed(x) | Moved(x) | Unmoved(x)) = self;
+ x
+ }
+}
+macro_rules! manipulator {
+ () => {impl FnMut(usize) -> Manip + Clone};
+}
+impl Snippet {
+ pub fn manipulate(&mut self, f: manipulator!()) {
+ self.stops = std::mem::take(&mut self.stops)
+ .into_iter()
+ .filter_map_at::<1>(|x| x.manipulate(f.clone()))
+ .collect();
+ self.last = self.last.take().and_then(|x| x.manipulate(f));
+ }
+}
+
+impl StopP {
+ pub fn manipulate(self, mut f: manipulator!()) -> Option<Self> {
+ match self {
+ Self::Just(x) => f(x).kept().map(Self::Just),
+ Self::Range(range) => match (f(range.start), f(range.end)) {
+ (Removed(..), Removed(..)) => None,
+ (
+ Moved(x) | Unmoved(x) | Removed(x),
+ Moved(y) | Unmoved(y) | Removed(y),
+ ) => Some(Self::Range(x..y)),
+ },
+ }
+ }
+}
+impl Cursors {
+ pub fn manipulate(&mut self, mut f: manipulator!()) {
+ self.each(|lem| {
+ lem.position = f(lem.position).unwrap();
+ if let Some(sel) = &mut lem.sel {
+ sel.start = f(sel.start).unwrap();
+ sel.end = f(sel.end).unwrap();
+ }
+ });
+ }
+}
+
+impl super::Bookmarks {
+ pub fn manipulate(&mut self, mut f: manipulator!()) {
+ self.0 = take(&mut self.0)
+ .into_iter()
+ .filter_map(|mut y| {
+ f(y.position).kept().map(|x| {
+ y.position = x;
+ y
+ })
+ })
+ .collect();
+ }
+ // pub fn to_gtl_d(&self) -> Vec<(PathBuf, Range)> {}
+}