use crate::{ expression::{BuiltinSelectionFn, ResultTransform, SearchModifier}, selection::Selection, selection_functions::{ function_character::selection_function_character, function_empty::selection_function_empty, function_end::selection_function_end, result_transformation::{complement_transform, conditional_transform}, }, state::EditorState, }; mod function_character; mod function_empty; mod function_end; mod result_transformation; mod types; pub use crate::selection_functions::types::{ SelectionFunction, SelectionFunctionError, UnparameterisedSelectionFunction, }; pub fn evaluate_selection_function( es: &EditorState, sf: BuiltinSelectionFn, search_mod: Option, result_transform: Option, left: Option, right: Option, ) -> Result { let res = match sf { BuiltinSelectionFn::CharOffset(off) => { selection_function_character(off, es, left.as_ref(), right.as_ref(), search_mod) } BuiltinSelectionFn::Empty => { selection_function_empty(es, left.as_ref(), right.as_ref(), search_mod) } BuiltinSelectionFn::EndOfBuffer => { selection_function_end(es, left.as_ref(), right.as_ref(), search_mod) } x => Err(SelectionFunctionError::NotImplemented(x)), }?; if let Some(result_transform) = result_transform { match result_transform { ResultTransform::Complement => complement_transform(es, res), ResultTransform::Conditional => conditional_transform(res, left.as_ref()), ResultTransform::ConditionalComplement => { let res = complement_transform(es, res)?; conditional_transform(res, left.as_ref()) } ResultTransform::ComplementConditional => { let res = conditional_transform(res, left.as_ref())?; complement_transform(es, res) } } } else { Ok(res) } }