aboutsummaryrefslogtreecommitdiff
path: root/rprt-engine/src/selection_functions/mod.rs
diff options
context:
space:
mode:
authortslil <tslil@posteo.de>2026-08-24 20:39:57 +0100
committertslil <tslil@posteo.de>2026-08-24 21:39:25 +0100
commitf3acb5cc0faf739f09112607bb98b6594184bd8b (patch)
tree9f60aeda21a775f9d34ed8a70fffd9be638f27ce /rprt-engine/src/selection_functions/mod.rs
parent72a5e0fc968e2bea9f7d348c7189ebc15a5b15d3 (diff)
The big transposition-ing: move from functions as data to data of functionsHEADmain
Basically Rust will fight you all the way if you treat it like Haskell, instead work with traits and impls on ZSTs.
Diffstat (limited to 'rprt-engine/src/selection_functions/mod.rs')
-rw-r--r--rprt-engine/src/selection_functions/mod.rs31
1 files changed, 16 insertions, 15 deletions
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<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),
- }?;
+) -> Result<Selection, SelectionFunctionError> {
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)
}
}