use crate::buffer::BufferID; use crate::selection::{Interval, Selection, VectoriseError}; use crate::state::EditorState; use thiserror::Error; #[derive(Error, Debug)] pub enum SFError {} struct SFComponents { niladic: Box Result>, monadic_rank0: Box Result>, monadic_rank1: Box Result>, dyadic: Option Result>>, } pub struct SelectionFunction { niladic: Box Result>, monadic: Box Result>, dyadic: Option Result>>, } impl From for SelectionFunction> { fn from(sfc: SFComponents) -> Self { let dyadic: Option _>> = if let Some(func) = sfc.dyadic { Some(Box::new( move |editor_state: &EditorState, left: &Selection, right: &Selection| { (func)(editor_state, left, right).map_err(VectoriseError::ProcessingError) }, )) } else { None }; Self { niladic: Box::new(move |editor_state: &EditorState| { (sfc.niladic)(editor_state).map_err(VectoriseError::ProcessingError) }), monadic: Box::new(Selection::vectorise(sfc.monadic_rank0, sfc.monadic_rank1)), dyadic: dyadic, } } }