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.rs68
1 files changed, 68 insertions, 0 deletions
diff --git a/rprt-engine/src/selection_function.rs b/rprt-engine/src/selection_function.rs
index c46e781..95281ad 100644
--- a/rprt-engine/src/selection_function.rs
+++ b/rprt-engine/src/selection_function.rs
@@ -51,6 +51,28 @@ macro_rules! selection_function {
};
}
+macro_rules! selection_function_param {
+ (
+ name: $name:ident,
+ param_type: $P:ty,
+ niladic: $niladic_body:expr,
+ monadic_rank0: $monadic_rank0_body:expr,
+ monadic_rank1: $monadic_rank1_body:expr
+ ) => {
+ pub fn $name(param: $P, arg: SFArguments) -> SFResult {
+ match arg {
+ SFArguments::Niladic { es } => {
+ rust_has_an_annoying_issue({ $niladic_body((param, es)) })
+ }
+ SFArguments::Monadic { es, left } => {
+ left.vectorise(&(param, es), $monadic_rank0_body, $monadic_rank1_body)
+ }
+ SFArguments::Dyadic { .. } => Err(SFError::NoDyadicForm(stringify!($name)).into()),
+ }
+ }
+ };
+}
+
// ----------------------------------------------------------------
pub fn complement_transform(es: &EditorState, result: Selection, _: &SFArguments) -> SFResult {
fn complement_rank0(
@@ -172,3 +194,49 @@ selection_function! {
pos: int.end,
})
}
+
+selection_function_param! {
+ name: character_structural,
+ param_type: usize,
+ niladic: |(param, es): (usize, &EditorState)| {
+ if let Some(buf) = es.current_buffer() {
+ Ok(Selection::Position {
+ buffer_id: es.current_buffer_id,
+ pos: usize::min(param, buf.max_pos()),
+ })
+ } else {
+ Err(SFError::BufferNotFound(es.current_buffer_id).into())
+ }
+ },
+ monadic_rank0: |_, buffer_id, pos| Ok(Selection::Position {buffer_id, pos}),
+ monadic_rank1: |(param, _), buffer_id, int| Ok(Selection::Position {buffer_id, pos: usize::min(int.end, *param)})
+}
+
+selection_function_param! {
+ name: character_sequential,
+ param_type: usize,
+ niladic: |(param, es): (usize, &EditorState)| {
+ if let Some(buf) = es.current_buffer() {
+ Ok(Selection::Position {
+ buffer_id: es.current_buffer_id,
+ pos: usize::min(param, buf.max_pos()),
+ })
+ } else {
+ Err(SFError::BufferNotFound(es.current_buffer_id).into())
+ }
+ },
+ monadic_rank0: |(param, es), buffer_id, pos| {
+ if let Some(buf) = es.get_buffer(buffer_id) {
+ Ok(Selection::Position {buffer_id, pos: usize::min(pos+*param, buf.max_pos())})
+ } else {
+ Err(SFError::BufferNotFound(buffer_id).into())
+ }
+ },
+ monadic_rank1: |(param, es), buffer_id, int| {
+ if let Some(buf) = es.get_buffer(buffer_id) {
+ Ok(Selection::Position {buffer_id, pos: usize::min(int.end+*param, buf.max_pos())})
+ } else {
+ Err(SFError::BufferNotFound(buffer_id).into())
+ }
+ }
+}