aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rprt-engine/src/selection_functions/function_character.rs64
-rw-r--r--rprt-engine/src/selection_functions/function_end.rs50
-rw-r--r--rprt-engine/src/selection_functions/types.rs4
3 files changed, 95 insertions, 23 deletions
diff --git a/rprt-engine/src/selection_functions/function_character.rs b/rprt-engine/src/selection_functions/function_character.rs
index 3d9695f..0d0699f 100644
--- a/rprt-engine/src/selection_functions/function_character.rs
+++ b/rprt-engine/src/selection_functions/function_character.rs
@@ -4,7 +4,7 @@ use crate::selection_functions::types::{get_buffer, SFArguments, SFError, SFResu
use crate::state::EditorState;
selection_function_param! {
- name: character_structural,
+ name: character,
param_type: usize,
niladic: |(param, es): (usize, &EditorState)| {
let buf = get_buffer(es, es.current_buffer_id)?;
@@ -14,19 +14,15 @@ selection_function_param! {
}) },
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)})
+ monadic_rank1: |(param, _), buffer_id, int| Ok(
+ Selection::Position {buffer_id, pos: usize::min(int.end, *param)}
+ )
}
-selection_function_param! {
- name: character_sequential,
+selection_function_param!(
+ name: sequential_character,
param_type: usize,
- niladic: |(param, es): (usize, &EditorState)| {
- let buf = get_buffer(es, es.current_buffer_id)?;
- Ok(Selection::Position {
- buffer_id: es.current_buffer_id,
- pos: usize::min(param, buf.max_pos()),
- })
- },
+ niladic: |_| Err(SFError::NoNiladicForm(";n").into()),
monadic_rank0: |(param, es), buffer_id, pos| {
let buf = get_buffer(es, buffer_id)?;
Ok(Selection::Position {buffer_id, pos: usize::min(pos+*param, buf.max_pos())})
@@ -35,4 +31,48 @@ selection_function_param! {
let buf = get_buffer(es, buffer_id)?;
Ok(Selection::Position {buffer_id, pos: usize::min(int.end+*param, buf.max_pos())})
}
-}
+);
+
+selection_function_param!(
+ name: reverse_character,
+ param_type: usize,
+ niladic: |(param, es): (usize, &EditorState)| {
+ let buf = get_buffer(es, es.current_buffer_id)?;
+ Ok(Selection::Position {
+ buffer_id: es.current_buffer_id,
+ pos: if buf.max_pos() < param {
+ 0
+ } else {
+ buf.max_pos() - param
+ },
+ })
+ },
+ 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: sequential_reverse_character,
+ param_type: usize,
+ niladic: |_| Err(SFError::NoNiladicForm(";'n").into()),
+ monadic_rank0: |(param, _), buffer_id, pos| {
+ Ok(Selection::Position {buffer_id, pos: if *param<pos {pos - *param} else {0}})
+ },
+ monadic_rank1: |(param, _), buffer_id, int| {
+ Ok(Selection::Position {buffer_id, pos: if *param<int.end {int.end - *param} else {0}})
+ }
+);
+
+selection_function_param!(
+ name: reverse_sequential_character,
+ param_type: usize,
+ niladic: |_| Err(SFError::NoNiladicForm("';n").into()),
+ monadic_rank0: |(param, _), buffer_id, pos| {
+ Ok(Selection::Position {buffer_id, pos: if *param<pos {pos - *param} else {0}})
+ },
+ monadic_rank1: |(param, _), buffer_id, int| {
+ Ok(Selection::Position {buffer_id, pos: if *param<int.start {int.start - *param} else {0}})
+ }
+);
diff --git a/rprt-engine/src/selection_functions/function_end.rs b/rprt-engine/src/selection_functions/function_end.rs
index 47cff79..3f18fd3 100644
--- a/rprt-engine/src/selection_functions/function_end.rs
+++ b/rprt-engine/src/selection_functions/function_end.rs
@@ -4,14 +4,43 @@ use crate::selection_functions::types::{get_buffer, SFArguments, SFError, SFResu
use crate::state::EditorState;
selection_function! {
- name: end_sequential,
+ name: end,
niladic: |es: &EditorState| {
let buf = get_buffer(es, es.current_buffer_id)?;
Ok(Selection::Position {
buffer_id: es.current_buffer_id,
- pos: buf.max_pos()
+ pos: buf.max_pos(),
})
},
+ monadic_rank0: |_, buffer_id, pos | Ok(Selection::Position { buffer_id, pos }),
+ monadic_rank1: |_, buffer_id, int | Ok(Selection::Position { buffer_id, pos: int.end })
+}
+
+selection_function! {
+ name: reverse_end,
+ niladic: |es: &EditorState| {
+ Ok(Selection::Position {
+ buffer_id: es.current_buffer_id,
+ pos: 0,
+ })
+ },
+ monadic_rank0: |_, buffer_id, pos | Ok(Selection::Position { buffer_id, pos }),
+ monadic_rank1: |_, buffer_id, int | Ok(Selection::Position { buffer_id, pos: int.start })
+}
+
+selection_function! {
+ name: sequential_end,
+ niladic: |_| Err(SFError::NoNiladicForm(";$").into()),
+ monadic_rank0: |_, buffer_id, pos| Ok(Selection::Position { buffer_id, pos }),
+ monadic_rank1: |es, buffer_id, _| {
+ let buf = get_buffer(es, buffer_id)?;
+ Ok(Selection::Position { buffer_id, pos: buf.max_pos() })
+ }
+}
+
+selection_function! {
+ name: sequential_reverse_end,
+ niladic: |_| Err(SFError::NoNiladicForm(";'$").into()),
monadic_rank0: |_, buffer_id, pos| {
Ok(Selection::Position { buffer_id, pos })
},
@@ -24,14 +53,15 @@ selection_function! {
}
selection_function! {
- name: end_structural,
- niladic: |es: &EditorState| {
- let buf = get_buffer(es, es.current_buffer_id)?;
+ name: reverse_sequential_end,
+ niladic: |_| Err(SFError::NoNiladicForm("';$").into()),
+ monadic_rank0: |_, buffer_id, pos| {
+ Ok(Selection::Position { buffer_id, pos })
+ },
+ monadic_rank1: |_, buffer_id, interval| {
Ok(Selection::Position {
- buffer_id: es.current_buffer_id,
- pos: buf.max_pos(),
+ buffer_id,
+ pos: interval.end,
})
- },
- monadic_rank0: |_, buffer_id, pos | Ok(Selection::Position { buffer_id, pos }),
- monadic_rank1: |_, buffer_id, int | Ok(Selection::Position { buffer_id, pos: int.end })
+ }
}
diff --git a/rprt-engine/src/selection_functions/types.rs b/rprt-engine/src/selection_functions/types.rs
index 728d084..aaf0086 100644
--- a/rprt-engine/src/selection_functions/types.rs
+++ b/rprt-engine/src/selection_functions/types.rs
@@ -9,6 +9,8 @@ pub enum SFError {
BufferNotFound(BufferID),
#[error("Function {0} has no dyadic form")]
NoDyadicForm(&'static str),
+ #[error("Function {0} has no dyadic form")]
+ NoNiladicForm(&'static str),
}
pub enum SFArguments<'a> {
@@ -59,7 +61,7 @@ macro_rules! selection_function_param {
) => {
pub fn $name(param: $P, arg: SFArguments) -> SFResult {
match arg {
- SFArguments::Niladic { es } => $niladic_body((param, es)),
+ SFArguments::Niladic { es } => ($niladic_body)((param, es)),
SFArguments::Monadic { es, left } => {
left.vectorise(&(param, es), $monadic_rank0_body, $monadic_rank1_body)
}