#![cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
use super::domain::check_domain;
use crate::core;
use crate::distributions::{normal_inverse_cdf, student_t_cdf};
use crate::stats;
#[wasm_bindgen]
pub fn get_t_cdf(t: f64, df: f64) -> f64 {
if check_domain().is_err() {
return f64::NAN;
}
student_t_cdf(t, df)
}
#[wasm_bindgen]
pub fn get_t_critical(alpha: f64, df: f64) -> f64 {
if check_domain().is_err() {
return f64::NAN;
}
core::t_critical_quantile(df, alpha)
}
#[wasm_bindgen]
pub fn get_normal_inverse(p: f64) -> f64 {
if check_domain().is_err() {
return f64::NAN;
}
normal_inverse_cdf(p)
}
#[wasm_bindgen]
pub fn stats_mean(data_json: String) -> String {
if check_domain().is_err() {
return "null".to_string();
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
serde_json::to_string(&stats::mean(&data)).unwrap_or("null".to_string())
}
#[wasm_bindgen]
pub fn stats_stddev(data_json: String) -> String {
if check_domain().is_err() {
return "null".to_string();
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
serde_json::to_string(&stats::stddev(&data)).unwrap_or("null".to_string())
}
#[wasm_bindgen]
pub fn stats_variance(data_json: String) -> String {
if check_domain().is_err() {
return "null".to_string();
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
serde_json::to_string(&stats::variance(&data)).unwrap_or("null".to_string())
}
#[wasm_bindgen]
pub fn stats_median(data_json: String) -> String {
if check_domain().is_err() {
return "null".to_string();
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
serde_json::to_string(&stats::median(&data)).unwrap_or("null".to_string())
}
#[wasm_bindgen]
pub fn stats_quantile(data_json: String, q: f64) -> String {
if check_domain().is_err() {
return "null".to_string();
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
serde_json::to_string(&stats::quantile(&data, q)).unwrap_or("null".to_string())
}
#[wasm_bindgen]
pub fn stats_correlation(x_json: String, y_json: String) -> String {
if check_domain().is_err() {
return "null".to_string();
}
let x: Vec<f64> = match serde_json::from_str(&x_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
let y: Vec<f64> = match serde_json::from_str(&y_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
serde_json::to_string(&stats::correlation(&x, &y)).unwrap_or("null".to_string())
}
#[wasm_bindgen]
pub fn stats_min(data_json: String) -> String {
if check_domain().is_err() {
return "null".to_string();
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
serde_json::to_string(&stats::min(&data)).unwrap_or("null".to_string())
}
#[wasm_bindgen]
pub fn stats_max(data_json: String) -> String {
if check_domain().is_err() {
return "null".to_string();
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
serde_json::to_string(&stats::max(&data)).unwrap_or("null".to_string())
}
#[wasm_bindgen]
pub fn stats_range(data_json: String) -> String {
if check_domain().is_err() {
return "null".to_string();
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(_) => return "null".to_string(),
};
serde_json::to_string(&stats::range(&data)).unwrap_or("null".to_string())
}
#[wasm_bindgen]
pub fn stats_mode(data_json: String) -> String {
if check_domain().is_err() {
return crate::error::error_json("Domain check failed");
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(e) => return crate::error::error_json(&format!("Invalid JSON: {}", e)),
};
match stats::mode(&data) {
Some(result) => serde_json::to_string(&result).unwrap_or_else(|_| crate::error::error_json("Serialization failed")),
None => crate::error::error_json("No mode (empty data or all NaN)"),
}
}
#[wasm_bindgen]
pub fn stats_five_number_summary(data_json: String) -> String {
if check_domain().is_err() {
return crate::error::error_json("Domain check failed");
}
let data: Vec<f64> = match serde_json::from_str(&data_json) {
Ok(d) => d,
Err(e) => return crate::error::error_json(&format!("Invalid JSON: {}", e)),
};
match stats::five_number_summary(&data) {
Some(summary) => {
serde_json::json!({
"min": summary.min,
"q1": summary.q1,
"median": summary.median,
"q3": summary.q3,
"max": summary.max,
"iqr": summary.iqr()
}).to_string()
}
None => crate::error::error_json("Empty data"),
}
}