diff options
| -rw-r--r-- | rprt-engine/src/selection_function.rs | 68 |
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()) + } + } +} |
