aboutsummaryrefslogtreecommitdiff
path: root/rprt-engine/src/selection_functions/function_character.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rprt-engine/src/selection_functions/function_character.rs')
-rw-r--r--rprt-engine/src/selection_functions/function_character.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/rprt-engine/src/selection_functions/function_character.rs b/rprt-engine/src/selection_functions/function_character.rs
new file mode 100644
index 0000000..3d9695f
--- /dev/null
+++ b/rprt-engine/src/selection_functions/function_character.rs
@@ -0,0 +1,38 @@
+use crate::selection::Selection;
+use crate::selection_function_param;
+use crate::selection_functions::types::{get_buffer, SFArguments, SFError, SFResult};
+use crate::state::EditorState;
+
+selection_function_param! {
+ name: character_structural,
+ 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())
+
+ }) },
+ 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)| {
+ 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()),
+ })
+ },
+ 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())})
+ },
+ monadic_rank1: |(param, es), buffer_id, int| {
+ let buf = get_buffer(es, buffer_id)?;
+ Ok(Selection::Position {buffer_id, pos: usize::min(int.end+*param, buf.max_pos())})
+ }
+}