use crate::{ buffer::BufferID, selection::{Interval, Selection, Vectorisable}, selection_functions::types::SelectionFunctionError, state::EditorState, }; struct Complement; impl Vectorisable<(), SelectionFunctionError> for Complement { fn rank0( &self, _param: &(), es: &EditorState, buffer_id: BufferID, pos: usize, ) -> Result { if let Some(buf) = es.get_buffer(buffer_id) { let mut ranges = Vec::new(); if pos > 0 { ranges.push(Interval::new(0, pos)); } let max_pos = buf.max_pos(); if pos + 1 < max_pos { ranges.push(Interval::new(pos + 1, max_pos)); } Ok(Selection::Vectors { buffer_id, ranges }) } else { Err(SelectionFunctionError::BufferNotFound(buffer_id)) } } fn rank1( &self, _param: &(), es: &EditorState, buffer_id: BufferID, interval: &Interval, ) -> Result { if let Some(buf) = es.get_buffer(buffer_id) { let max_pos = buf.max_pos(); if interval.start == 0 && interval.end >= max_pos { return Ok(Selection::empty()); } let mut ranges = Vec::new(); if interval.start == 0 { if interval.end < max_pos { ranges.push(Interval::new(interval.end, max_pos)); } } else if interval.end == max_pos { ranges.push(Interval::new(0, interval.start)); } else { ranges.push(Interval::new(0, interval.start)); ranges.push(Interval::new(interval.end, max_pos)); } Ok(Selection::Vectors { buffer_id, ranges }) } else { Err(SelectionFunctionError::BufferNotFound(buffer_id)) } } } pub fn complement_transform( es: &EditorState, result: Selection, ) -> Result { Complement.vectorise(&(), es, &result) } pub fn conditional_transform( mut result: Selection, left: Option<&Selection>, ) -> Result { if !result.is_empty() { Ok(left.cloned().unwrap_or_else(Selection::empty)) } else { Ok(result) } }