aboutsummaryrefslogtreecommitdiff
path: root/rprt-engine/src/selection_functions/mod.rs
diff options
context:
space:
mode:
authortslil <tslil@posteo.de>2026-03-21 08:49:35 +0000
committertslil <tslil@posteo.de>2026-03-21 17:26:50 +0000
commitc22cc3b348bdcb446fb0e44070da36fdf6b05800 (patch)
tree81371ff735529e7b2a5b1727be9c8b06123609e6 /rprt-engine/src/selection_functions/mod.rs
parent5a5da7bc299bee12072e421d1936554690e34dd6 (diff)
big rework to support evaluation of selection functions, WiP
Diffstat (limited to 'rprt-engine/src/selection_functions/mod.rs')
-rw-r--r--rprt-engine/src/selection_functions/mod.rs64
1 files changed, 59 insertions, 5 deletions
diff --git a/rprt-engine/src/selection_functions/mod.rs b/rprt-engine/src/selection_functions/mod.rs
index 3f64be4..b753200 100644
--- a/rprt-engine/src/selection_functions/mod.rs
+++ b/rprt-engine/src/selection_functions/mod.rs
@@ -1,5 +1,59 @@
-pub mod function_character;
-pub mod function_empty;
-pub mod function_end;
-pub mod result_transformation;
-pub mod types;
+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<SearchModifier>,
+ result_transform: Option<ResultTransform>,
+ left: Option<Selection>,
+ right: Option<Selection>,
+) -> 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)
+ }
+}