use wasm_bindgen::prelude::*;
use spliny::SplineCurve;
use crate::{CubicSplineFit, evaluate, ops};
#[wasm_bindgen]
pub struct CubicSpline {
inner: SplineCurve<3, 1>,
}
#[wasm_bindgen]
impl CubicSpline {
pub fn smoothing(x: Vec<f64>, y: Vec<f64>, rms: f64) -> Result<CubicSpline, JsError> {
let s = CubicSplineFit::new(x, y)
.smoothing_spline(rms)
.map_err(|e| JsError::new(&e.to_string()))?;
Ok(CubicSpline { inner: s })
}
pub fn interpolating(x: Vec<f64>, y: Vec<f64>) -> Result<CubicSpline, JsError> {
let s = CubicSplineFit::new(x, y)
.interpolating_spline()
.map_err(|e| JsError::new(&e.to_string()))?;
Ok(CubicSpline { inner: s })
}
pub fn cardinal(x: Vec<f64>, y: Vec<f64>, dt: f64) -> Result<CubicSpline, JsError> {
let s = CubicSplineFit::new(x, y)
.cardinal_spline(dt)
.map_err(|e| JsError::new(&e.to_string()))?;
Ok(CubicSpline { inner: s })
}
pub fn evaluate(&self, x: &[f64]) -> Result<Vec<f64>, JsError> {
evaluate::evaluate(&self.inner, x)
.map_err(|e| JsError::new(&e.to_string()))
}
pub fn integral(&self, a: f64, b: f64) -> f64 {
ops::integral(&self.inner, a, b)
}
pub fn roots(&self) -> Result<Vec<f64>, JsError> {
ops::roots(&self.inner)
.map_err(|e| JsError::new(&e.to_string()))
}
pub fn knots(&self) -> Vec<f64> {
self.inner.t.clone()
}
pub fn coefficients(&self) -> Vec<f64> {
self.inner.c.clone()
}
#[wasm_bindgen(getter)]
pub fn num_knots(&self) -> usize {
self.inner.t.len()
}
}