use wasm_bindgen::prelude::*; use web_sys::HtmlCanvasElement; mod func_plot; #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; pub type DrawResult = Result>; /// Result of screen to chart coordinates conversion. #[wasm_bindgen] pub struct Point { pub x: f32, pub y: f32, } #[wasm_bindgen] impl Point { pub fn new(x: f32, y: f32) -> Self { Self { x, y } } } #[wasm_bindgen] pub struct Chart { convert: Box Option<(f32, f32)>>, area: f32, } #[wasm_bindgen] impl Chart { pub fn draw( canvas: HtmlCanvasElement, func_str: &str, min_x: f32, max_x: f32, min_y: f32, max_y: f32, num_interval: usize, resolution: i32, ) -> Result { let draw_output = func_plot::draw( canvas, func_str, min_x, max_x, min_y, max_y, num_interval, resolution, ) .map_err(|err| err.to_string())?; let map_coord = draw_output.0; Ok(Chart { convert: Box::new(move |coord| map_coord(coord).map(|(x, y)| (x, y))), area: draw_output.1, }) } pub fn get_area(&self) -> f32 { self.area } pub fn coord(&self, x: i32, y: i32) -> Option { (self.convert)((x, y)).map(|(x, y)| Point::new(x, y)) } }