Get rid of a bunch of clones.

pull/1/head
Blaž Hrastnik 4 years ago
parent f9348d77ec
commit f098166571

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

@ -211,11 +211,14 @@ impl Selection {
} }
/// Takes a closure and maps each selection over the closure. /// 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 where
F: Fn(Range) -> Range, 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,
)
} }
} }

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

Loading…
Cancel
Save