aboutsummaryrefslogtreecommitdiff
path: root/rprt-engine/src/selection_function.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rprt-engine/src/selection_function.rs')
-rw-r--r--rprt-engine/src/selection_function.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/rprt-engine/src/selection_function.rs b/rprt-engine/src/selection_function.rs
new file mode 100644
index 0000000..6f05650
--- /dev/null
+++ b/rprt-engine/src/selection_function.rs
@@ -0,0 +1,43 @@
+use crate::buffer::BufferID;
+use crate::selection::{Interval, Selection, VectoriseError};
+use crate::state::EditorState;
+use thiserror::Error;
+
+#[derive(Error, Debug)]
+pub enum SFError {}
+
+struct SFComponents {
+ niladic: Box<dyn Fn(&EditorState) -> Result<Selection, SFError>>,
+ monadic_rank0: Box<dyn Fn(&EditorState, &BufferID, usize) -> Result<Selection, SFError>>,
+ monadic_rank1: Box<dyn Fn(&EditorState, &BufferID, &Interval) -> Result<Selection, SFError>>,
+ dyadic: Option<Box<dyn Fn(&EditorState, &Selection, &Selection) -> Result<Selection, SFError>>>,
+}
+
+pub struct SelectionFunction<E> {
+ niladic: Box<dyn Fn(&EditorState) -> Result<Selection, E>>,
+ monadic: Box<dyn Fn(&EditorState, &Selection) -> Result<Selection, E>>,
+ dyadic: Option<Box<dyn Fn(&EditorState, &Selection, &Selection) -> Result<Selection, E>>>,
+}
+
+impl From<SFComponents> for SelectionFunction<VectoriseError<SFError>> {
+ fn from(sfc: SFComponents) -> Self {
+ let dyadic: Option<Box<dyn Fn(&EditorState, &Selection, &Selection) -> _>> =
+ if let Some(func) = sfc.dyadic {
+ Some(Box::new(
+ move |editor_state: &EditorState, left: &Selection, right: &Selection| {
+ (func)(editor_state, left, right).map_err(VectoriseError::ProcessingError)
+ },
+ ))
+ } else {
+ None
+ };
+
+ Self {
+ niladic: Box::new(move |editor_state: &EditorState| {
+ (sfc.niladic)(editor_state).map_err(VectoriseError::ProcessingError)
+ }),
+ monadic: Box::new(Selection::vectorise(sfc.monadic_rank0, sfc.monadic_rank1)),
+ dyadic: dyadic,
+ }
+ }
+}