use crate::{ expression::{BuiltinSelectionFn, ResultTransform, SearchModifier}, selection::Selection, selection_functions::{ function_character::selection_function_character, function_end::selection_function_end, result_transformation::{complement_transform, conditional_transform}, types::SFArguments, }, state::EditorState, }; mod function_character; mod function_empty; mod function_end; mod result_transformation; mod types; pub use crate::selection_functions::types::{SFError, SFResult}; pub fn evaluate_selection_function( es: &EditorState, sf: BuiltinSelectionFn, search_mod: Option, result_transform: Option, left: Option, right: Option, ) -> SFResult { let sf_args = match (left, right) { (None, None) => Ok(SFArguments::Niladic { es }), (Some(left), None) => Ok(SFArguments::Monadic { es, left }), (Some(left), Some(right)) => Ok(SFArguments::Dyadic { es, left, right }), _ => Err(SFError::NoLeftArgument), }?; let res = match sf { BuiltinSelectionFn::CharOffset(off) => { selection_function_character(off, &sf_args, search_mod) } BuiltinSelectionFn::EndOfBuffer => selection_function_end((), &sf_args, search_mod), x => Err(SFError::NotImplemented(x).into()), }?; if let Some(result_transform) = result_transform { match result_transform { ResultTransform::Complement => complement_transform(es, res), ResultTransform::Conditional => conditional_transform(res, &sf_args), ResultTransform::ConditionalComplement => { let res = complement_transform(es, res)?; conditional_transform(res, &sf_args) } ResultTransform::ComplementConditional => { let res = conditional_transform(res, &sf_args)?; complement_transform(es, res) } } } else { Ok(res) } }