From f3acb5cc0faf739f09112607bb98b6594184bd8b Mon Sep 17 00:00:00 2001 From: tslil Date: Mon, 24 Aug 2026 20:39:57 +0100 Subject: The big transposition-ing: move from functions as data to data of functions Basically Rust will fight you all the way if you treat it like Haskell, instead work with traits and impls on ZSTs. --- rprt-engine/src/selection_functions/mod.rs | 31 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'rprt-engine/src/selection_functions/mod.rs') diff --git a/rprt-engine/src/selection_functions/mod.rs b/rprt-engine/src/selection_functions/mod.rs index b753200..85c333e 100644 --- a/rprt-engine/src/selection_functions/mod.rs +++ b/rprt-engine/src/selection_functions/mod.rs @@ -3,9 +3,9 @@ use crate::{ 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}, - types::SFArguments, }, state::EditorState, }; @@ -16,7 +16,9 @@ mod function_end; mod result_transformation; mod types; -pub use crate::selection_functions::types::{SFError, SFResult}; +pub use crate::selection_functions::types::{ + SelectionFunction, SelectionFunctionError, UnparameterisedSelectionFunction, +}; pub fn evaluate_selection_function( es: &EditorState, @@ -25,31 +27,30 @@ pub fn evaluate_selection_function( 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), - }?; +) -> Result { let res = match sf { BuiltinSelectionFn::CharOffset(off) => { - selection_function_character(off, &sf_args, search_mod) + 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) } - BuiltinSelectionFn::EndOfBuffer => selection_function_end((), &sf_args, search_mod), - x => Err(SFError::NotImplemented(x).into()), + 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, &sf_args), + ResultTransform::Conditional => conditional_transform(res, left.as_ref()), ResultTransform::ConditionalComplement => { let res = complement_transform(es, res)?; - conditional_transform(res, &sf_args) + conditional_transform(res, left.as_ref()) } ResultTransform::ComplementConditional => { - let res = conditional_transform(res, &sf_args)?; + let res = conditional_transform(res, left.as_ref())?; complement_transform(es, res) } } -- cgit v1.2.3