use crate::{ dispatch_selection_function, selection::Selection, selection_function, selection_functions::types::{SFArguments, SFError, SFResult, get_buffer}, state::EditorState, }; selection_function! { name: 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()) }) }, 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!( name: sequential_character, param_type: usize, 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())}) }, 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())}) } ); selection_function!( 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!( 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