use crate::{ dispatch_selection_function, selection::Selection, selection_function, selection_functions::types::{SFArguments, SFError, SFResult, get_buffer}, state::EditorState, }; selection_function! { name: end, param_type: (), 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(), }) }, 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, param_type: (), 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, param_type: (), 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, param_type: (), 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, pos: interval.end, }) } } selection_function! { name: reverse_sequential_end, param_type: (), 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, pos: interval.end, }) } } dispatch_selection_function!( name: selection_function_end, param_type: (), base: end, sequential: sequential_end, reverse: reverse_end, sequential_reverse: sequential_reverse_end, reverse_sequential: reverse_sequential_end, );