diff options
| -rw-r--r-- | rprt-engine/src/selection_functions/function_character.rs | 64 | ||||
| -rw-r--r-- | rprt-engine/src/selection_functions/function_end.rs | 50 | ||||
| -rw-r--r-- | rprt-engine/src/selection_functions/types.rs | 4 |
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) } |
