use crate::geometric_optics;
use js_sys::Float64Array;
use wasm_bindgen::prelude::*;
fn to_vec(arr: &Float64Array) -> Vec<f64> {
arr.to_vec()
}
fn to_float64_array(v: &[f64]) -> Float64Array {
let arr = Float64Array::new_with_length(v.len() as u32);
arr.copy_from(v);
arr
}
#[wasm_bindgen(js_name = "bladeGrade")]
pub fn blade_grade(blade_index: usize) -> u32 {
geometric_optics::blade_grade(blade_index)
}
#[wasm_bindgen(js_name = "bladesAtGradeCount")]
pub fn blades_at_grade_count(dimension: u32, grade: u32) -> usize {
geometric_optics::blades_at_grade_count(dimension, grade)
}
#[wasm_bindgen(js_name = "gradeIndices")]
pub fn grade_indices(dimension: u32, grade: u32) -> Vec<usize> {
geometric_optics::grade_indices(dimension, grade)
}
#[wasm_bindgen(js_name = "gradeExtract")]
pub fn grade_extract(dimension: u32, grade: u32, coefficients: &Float64Array) -> Float64Array {
let v = to_vec(coefficients);
to_float64_array(&geometric_optics::grade_extract(dimension, grade, &v))
}
#[wasm_bindgen(js_name = "gradeProject")]
pub fn grade_project(dimension: u32, grade: u32, coefficients: &Float64Array) -> Float64Array {
let v = to_vec(coefficients);
to_float64_array(&geometric_optics::grade_project(dimension, grade, &v))
}
#[wasm_bindgen(js_name = "gradeProjectMax")]
pub fn grade_project_max(
dimension: u32,
max_grade: u32,
coefficients: &Float64Array,
) -> Float64Array {
let v = to_vec(coefficients);
to_float64_array(&geometric_optics::grade_project_max(
dimension, max_grade, &v,
))
}
#[wasm_bindgen(js_name = "gradeMask")]
pub fn grade_mask(dimension: u32, coefficients: &Float64Array) -> u32 {
let v = to_vec(coefficients);
geometric_optics::grade_mask(dimension, &v)
}
#[wasm_bindgen(js_name = "hasGrade")]
pub fn has_grade(dimension: u32, grade: u32, coefficients: &Float64Array) -> bool {
let v = to_vec(coefficients);
geometric_optics::has_grade(dimension, grade, &v)
}
#[wasm_bindgen(js_name = "isPureGrade")]
pub fn is_pure_grade(dimension: u32, coefficients: &Float64Array) -> bool {
let v = to_vec(coefficients);
geometric_optics::is_pure_grade(dimension, &v)
}
#[wasm_bindgen(js_name = "componentGet")]
pub fn component_get(coefficients: &Float64Array, blade_index: usize) -> Option<f64> {
let v = to_vec(coefficients);
geometric_optics::component_get(&v, blade_index)
}
#[wasm_bindgen(js_name = "componentSet")]
pub fn component_set(coefficients: &Float64Array, blade_index: usize, value: f64) -> Float64Array {
let v = to_vec(coefficients);
to_float64_array(&geometric_optics::component_set(&v, blade_index, value))
}
#[wasm_bindgen(js_name = "mvNorm")]
pub fn mv_norm(coefficients: &Float64Array) -> f64 {
let v = to_vec(coefficients);
geometric_optics::norm(&v)
}
#[wasm_bindgen(js_name = "mvNormSquared")]
pub fn mv_norm_squared(coefficients: &Float64Array) -> f64 {
let v = to_vec(coefficients);
geometric_optics::norm_squared(&v)
}
#[wasm_bindgen(js_name = "mvNormalize")]
pub fn mv_normalize(coefficients: &Float64Array) -> Option<Float64Array> {
let v = to_vec(coefficients);
geometric_optics::normalize(&v).map(|n| to_float64_array(&n))
}
#[wasm_bindgen(js_name = "gradeInvolution")]
pub fn grade_involution(dimension: u32, coefficients: &Float64Array) -> Float64Array {
let v = to_vec(coefficients);
to_float64_array(&geometric_optics::grade_involution(dimension, &v))
}
#[wasm_bindgen(js_name = "mvReverse")]
pub fn mv_reverse(dimension: u32, coefficients: &Float64Array) -> Float64Array {
let v = to_vec(coefficients);
to_float64_array(&geometric_optics::reverse(dimension, &v))
}