use crate::{ buffer::BufferID, selection::{Interval, Selection}, selection_functions::types::{SFArguments, SFError, SFResult}, state::EditorState, }; pub fn complement_transform(es: &EditorState, result: Selection) -> SFResult { fn complement_rank0( 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(SFError::BufferNotFound(buffer_id)) } } fn complement_rank1( 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(SFError::BufferNotFound(buffer_id)) } } result.vectorise(es, complement_rank0, complement_rank1) } pub fn conditional_transform(mut result: Selection, arg: &SFArguments) -> SFResult { if !result.is_empty() { Ok(match arg { // TODO: think about this niladic case? SFArguments::Niladic { .. } => Selection::empty(), SFArguments::Monadic { es: _, left } => left.clone(), SFArguments::Dyadic { es: _, left, right: _, } => left.clone(), }) } else { Ok(result) } }