From 05eec63bac0095f38fffd56ba99781c9a8f7c406 Mon Sep 17 00:00:00 2001 From: rhysd Date: Thu, 9 Jun 2022 23:06:36 +0900 Subject: [PATCH] remove duplicate in undo/redo implementation --- src/edit.rs | 96 +++++++++++++++++++++++++---------------------------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/src/edit.rs b/src/edit.rs index 9bd0563..3003d29 100644 --- a/src/edit.rs +++ b/src/edit.rs @@ -6,6 +6,50 @@ pub enum EditKind { Insert(String, usize), } +impl EditKind { + fn redo(&self, row: usize, lines: &mut Vec) { + match self { + EditKind::InsertChar(c, i) => { + lines[row].insert(*i, *c); + } + EditKind::DeleteChar(_, i) => { + lines[row].remove(*i); + } + EditKind::InsertNewline(i) => { + let line = &mut lines[row]; + let next_line = line[*i..].to_string(); + line.truncate(*i); + line.push(' '); + lines.insert(row + 1, next_line); + } + EditKind::DeleteNewline(_) => { + if row > 0 { + let line = lines.remove(row); + let prev_line = &mut lines[row - 1]; + prev_line.pop(); // Remove trailing space + prev_line.push_str(&line); + } + } + EditKind::Insert(s, i) => { + lines[row].insert_str(*i, s.as_str()); + } + } + } + + fn undo(&self, row: usize, lines: &mut Vec) { + use EditKind::*; + match self { + InsertChar(c, i) => DeleteChar(*c, *i).redo(row, lines), + DeleteChar(c, i) => InsertChar(*c, *i).redo(row, lines), + InsertNewline(i) => DeleteNewline(*i).redo(row, lines), + DeleteNewline(i) => InsertNewline(*i).redo(row, lines), + Insert(s, i) => { + lines[row].replace_range(*i..s.len(), ""); + } + } + } +} + pub struct Edit { kind: EditKind, cursor_before: (usize, usize), @@ -27,60 +71,12 @@ impl Edit { pub fn redo(&self, lines: &mut Vec) { let (row, _) = self.cursor_before; - match self.kind { - EditKind::InsertChar(c, i) => { - lines[row].insert(i, c); - } - EditKind::DeleteChar(_, i) => { - lines[row].remove(i); - } - EditKind::InsertNewline(i) => { - let line = &mut lines[row]; - let next_line = line[i..].to_string(); - line.truncate(i); - line.push(' '); - lines.insert(row + 1, next_line); - } - EditKind::DeleteNewline(_) => { - if row > 0 { - let line = lines.remove(row); - let prev_line = &mut lines[row - 1]; - prev_line.pop(); // Remove trailing space - prev_line.push_str(&line); - } - } - EditKind::Insert(ref s, i) => { - lines[row].insert_str(i, s.as_str()); - } - } + self.kind.redo(row, lines) } pub fn undo(&self, lines: &mut Vec) { let (row, _) = self.cursor_after; - match self.kind { - EditKind::InsertChar(_, i) => { - lines[row].remove(i); - } - EditKind::DeleteChar(c, i) => { - lines[row].insert(i, c); - } - EditKind::InsertNewline(_) => { - let line = lines.remove(row); - let prev_line = &mut lines[row - 1]; - prev_line.pop(); // Remove trailing space - prev_line.push_str(&line); - } - EditKind::DeleteNewline(i) => { - let line = &mut lines[row]; - let next_line = line[i..].to_string(); - line.truncate(i); - line.push(' '); - lines.insert(row + 1, next_line); - } - EditKind::Insert(ref s, i) => { - lines[row].replace_range(i..s.len(), ""); - } - } + self.kind.undo(row, lines) } pub fn cursor_before(&self) -> (usize, usize) {