diff options
Diffstat (limited to 'src/util/edit_map.rs')
-rw-r--r-- | src/util/edit_map.rs | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/src/util/edit_map.rs b/src/util/edit_map.rs index 0d58f01..665367a 100644 --- a/src/util/edit_map.rs +++ b/src/util/edit_map.rs @@ -66,18 +66,11 @@ impl EditMap { } } /// Create an edit: a remove and/or add at a certain place. - pub fn add(&mut self, index: usize, mut remove: usize, mut add: Vec<Event>) { - assert!(!self.consumed, "cannot add after consuming"); - - if let Some((curr_remove, mut curr_add)) = self.map.remove(&index) { - // To do: these might have to be split in several chunks instead - // of one, if links in `curr_add` are supported. - remove += curr_remove; - curr_add.append(&mut add); - add = curr_add; - } - - self.map.insert(index, (remove, add)); + pub fn add(&mut self, index: usize, remove: usize, add: Vec<Event>) { + add_impl(self, index, remove, add, false); + } + pub fn add_before(&mut self, index: usize, remove: usize, add: Vec<Event>) { + add_impl(self, index, remove, add, true); } /// Done, change the events. pub fn consume(&mut self, events: &mut [Event]) -> Vec<Event> { @@ -142,3 +135,27 @@ impl EditMap { next_events } } + +fn add_impl( + edit_map: &mut EditMap, + index: usize, + mut remove: usize, + mut add: Vec<Event>, + before: bool, +) { + assert!(!edit_map.consumed, "cannot add after consuming"); + + if let Some((curr_remove, mut curr_add)) = edit_map.map.remove(&index) { + // To do: these might have to be split in several chunks instead + // of one, if links in `curr_add` are supported. + remove += curr_remove; + if before { + add.append(&mut curr_add); + } else { + curr_add.append(&mut add); + add = curr_add; + } + } + + edit_map.map.insert(index, (remove, add)); +} |