1
0
Fork 0
mirror of https://github.com/helix-editor/helix synced 2024-05-21 04:06:06 +02:00

Get rid of a bunch of clones.

This commit is contained in:
Blaž Hrastnik 2020-09-12 23:52:38 +09:00
parent f9348d77ec
commit f098166571
3 changed files with 14 additions and 38 deletions

View File

@ -10,47 +10,23 @@
pub fn move_char_left(state: &mut State, count: usize) {
// TODO: use a transaction
let selection = state.move_selection(
// TODO: remove the clone here
state.selection.clone(),
Direction::Backward,
Granularity::Character,
count,
);
let selection = state.move_selection(Direction::Backward, Granularity::Character, count);
state.selection = selection;
}
pub fn move_char_right(state: &mut State, count: usize) {
// TODO: use a transaction
state.selection = state.move_selection(
// TODO: remove the clone here
state.selection.clone(),
Direction::Forward,
Granularity::Character,
count,
);
state.selection = state.move_selection(Direction::Forward, Granularity::Character, count);
}
pub fn move_line_up(state: &mut State, count: usize) {
// TODO: use a transaction
state.selection = state.move_selection(
// TODO: remove the clone here
state.selection.clone(),
Direction::Backward,
Granularity::Line,
count,
);
state.selection = state.move_selection(Direction::Backward, Granularity::Line, count);
}
pub fn move_line_down(state: &mut State, count: usize) {
// TODO: use a transaction
state.selection = state.move_selection(
// TODO: remove the clone here
state.selection.clone(),
Direction::Forward,
Granularity::Line,
count,
);
state.selection = state.move_selection(Direction::Forward, Granularity::Line, count);
}
// avoid select by default by having a visual mode switch that makes movements into selects
@ -66,7 +42,6 @@ pub fn insert_mode(state: &mut State, _count: usize) {
state.selection = state
.selection
.clone()
.transform(|range| Range::new(range.to(), range.from()))
}
@ -76,7 +51,7 @@ pub fn append_mode(state: &mut State, _count: usize) {
// TODO: as transaction
let text = &state.doc.slice(..);
state.selection = state.selection.clone().transform(|range| {
state.selection = state.selection.transform(|range| {
// TODO: to() + next char
Range::new(range.from(), next_grapheme_boundary(text, range.to()))
})

View File

@ -211,11 +211,14 @@ pub fn single(anchor: usize, head: usize) -> Self {
}
/// Takes a closure and maps each selection over the closure.
pub fn transform<F>(self, f: F) -> Self
pub fn transform<F>(&self, f: F) -> Self
where
F: Fn(Range) -> Range,
{
Self::new(self.ranges.into_iter().map(f).collect(), self.primary_index)
Self::new(
self.ranges.iter().copied().map(f).collect(),
self.primary_index,
)
}
}

View File

@ -115,7 +115,6 @@ pub fn move_pos(
pub fn move_selection(
&self,
sel: Selection,
dir: Direction,
granularity: Granularity,
count: usize,
@ -123,7 +122,7 @@ pub fn move_selection(
// TODO: move all selections according to normal cursor move semantics by collapsing it
// into cursors and moving them vertically
let ranges = sel.ranges.into_iter().map(|range| {
let ranges = self.selection.ranges.iter().map(|range| {
// let pos = if !range.is_empty() {
// // if selection already exists, bump it to the start or end of current select first
// if dir == Direction::Backward {
@ -137,23 +136,22 @@ pub fn move_selection(
SelectionRange::new(pos, pos)
});
Selection::new(ranges.collect(), sel.primary_index)
Selection::new(ranges.collect(), self.selection.primary_index)
// TODO: update selection in state via transaction
}
pub fn extend_selection(
&self,
sel: Selection,
dir: Direction,
granularity: Granularity,
count: usize,
) -> Selection {
let ranges = sel.ranges.into_iter().map(|range| {
let ranges = self.selection.ranges.iter().map(|range| {
let pos = self.move_pos(range.head, dir, granularity, count);
SelectionRange::new(range.anchor, pos)
});
Selection::new(ranges.collect(), sel.primary_index)
Selection::new(ranges.collect(), self.selection.primary_index)
// TODO: update selection in state via transaction
}
}