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, 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: 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_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