// Generated by scripts/generate.mjs from bindings/api.mjs. Do not edit.

///|
#external
pub type NURBSUtils

///|
#module("@mizchi/three-mbt/parametric")
pub extern "js" fn NURBSUtils::NURBSUtils() -> NURBSUtils = "nURBSUtils"

///|
extern "js" fn NURBSUtils::ffi_find_span(
  self : NURBSUtils,
  degree : Int,
  u : Double,
  knots : FixedArray[Double],
) -> JsResult[Int] =
  #| (self, degree, u, knots) => { try { return { ok: true, value: (() => self.findSpan(degree, u, knots))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::find_span(
  self : NURBSUtils,
  degree : Int,
  u : Double,
  knots : FixedArray[Double],
) -> Int raise ModelingError {
  match self.ffi_find_span(degree, u, knots).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSUtils::ffi_basis_functions(
  self : NURBSUtils,
  span : Int,
  u : Double,
  degree : Int,
  knots : FixedArray[Double],
) -> JsResult[FixedArray[Double]] =
  #| (self, span, u, degree, knots) => { try { return { ok: true, value: (() => self.calcBasisFunctions(span, u, degree, knots))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::basis_functions(
  self : NURBSUtils,
  span : Int,
  u : Double,
  degree : Int,
  knots : FixedArray[Double],
) -> FixedArray[Double] raise ModelingError {
  match self.ffi_basis_functions(span, u, degree, knots).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSUtils::ffi_basis_derivatives(
  self : NURBSUtils,
  span : Int,
  u : Double,
  degree : Int,
  order : Int,
  knots : FixedArray[Double],
) -> JsResult[FixedArray[FixedArray[Double]]] =
  #| (self, span, u, degree, order, knots) => { try { return { ok: true, value: (() => self.calcBasisFunctionDerivatives(span, u, degree, order, knots))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::basis_derivatives(
  self : NURBSUtils,
  span : Int,
  u : Double,
  degree : Int,
  order : Int,
  knots : FixedArray[Double],
) -> FixedArray[FixedArray[Double]] raise ModelingError {
  match
    self.ffi_basis_derivatives(span, u, degree, order, knots).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSUtils::ffi_bspline_point(
  self : NURBSUtils,
  degree : Int,
  knots : FixedArray[Double],
  points : FixedArray[Vector4],
  u : Double,
) -> JsResult[Vector4] =
  #| (self, degree, knots, points, u) => { try { return { ok: true, value: (() => self.calcBSplinePoint(degree, knots, points, u))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::bspline_point(
  self : NURBSUtils,
  degree : Int,
  knots : FixedArray[Double],
  points : FixedArray[Vector4],
  u : Double,
) -> Vector4 raise ModelingError {
  match self.ffi_bspline_point(degree, knots, points, u).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSUtils::ffi_bspline_derivatives(
  self : NURBSUtils,
  degree : Int,
  knots : FixedArray[Double],
  points : FixedArray[Vector4],
  u : Double,
  order : Int,
) -> JsResult[FixedArray[Vector4]] =
  #| (self, degree, knots, points, u, order) => { try { return { ok: true, value: (() => self.calcBSplineDerivatives(degree, knots, points, u, order))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::bspline_derivatives(
  self : NURBSUtils,
  degree : Int,
  knots : FixedArray[Double],
  points : FixedArray[Vector4],
  u : Double,
  order : Int,
) -> FixedArray[Vector4] raise ModelingError {
  match
    self.ffi_bspline_derivatives(degree, knots, points, u, order).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSUtils::ffi_curve_derivatives(
  self : NURBSUtils,
  degree : Int,
  knots : FixedArray[Double],
  points : FixedArray[Vector4],
  u : Double,
  order : Int,
) -> JsResult[FixedArray[Vector3]] =
  #| (self, degree, knots, points, u, order) => { try { return { ok: true, value: (() => self.calcNURBSDerivatives(degree, knots, points, u, order))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::curve_derivatives(
  self : NURBSUtils,
  degree : Int,
  knots : FixedArray[Double],
  points : FixedArray[Vector4],
  u : Double,
  order : Int,
) -> FixedArray[Vector3] raise ModelingError {
  match
    self.ffi_curve_derivatives(degree, knots, points, u, order).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSUtils::ffi_binomial(
  self : NURBSUtils,
  k : Int,
  i : Int,
) -> JsResult[Double] =
  #| (self, k, i) => { try { return { ok: true, value: (() => self.calcKoverI(k, i))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::binomial(
  self : NURBSUtils,
  k : Int,
  i : Int,
) -> Double raise ModelingError {
  match self.ffi_binomial(k, i).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSUtils::ffi_rational_derivatives(
  self : NURBSUtils,
  derivatives : FixedArray[Vector4],
) -> JsResult[FixedArray[Vector3]] =
  #| (self, derivatives) => { try { return { ok: true, value: (() => self.calcRationalCurveDerivatives(derivatives))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::rational_derivatives(
  self : NURBSUtils,
  derivatives : FixedArray[Vector4],
) -> FixedArray[Vector3] raise ModelingError {
  match self.ffi_rational_derivatives(derivatives).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSUtils::ffi_surface_point(
  self : NURBSUtils,
  degree_u : Int,
  degree_v : Int,
  knots_u : FixedArray[Double],
  knots_v : FixedArray[Double],
  points : FixedArray[FixedArray[Vector4]],
  u : Double,
  v : Double,
  target : Vector3,
) -> JsResult[Vector3] =
  #| (self, degree_u, degree_v, knots_u, knots_v, points, u, v, target) => { try { return { ok: true, value: (() => self.calcSurfacePoint(degree_u, degree_v, knots_u, knots_v, points, u, v, target))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::surface_point(
  self : NURBSUtils,
  degree_u : Int,
  degree_v : Int,
  knots_u : FixedArray[Double],
  knots_v : FixedArray[Double],
  points : FixedArray[FixedArray[Vector4]],
  u : Double,
  v : Double,
  target : Vector3,
) -> Vector3 raise ModelingError {
  match
    self
    .ffi_surface_point(
      degree_u, degree_v, knots_u, knots_v, points, u, v, target,
    )
    .into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSUtils::ffi_volume_point(
  self : NURBSUtils,
  degree_u : Int,
  degree_v : Int,
  degree_w : Int,
  knots_u : FixedArray[Double],
  knots_v : FixedArray[Double],
  knots_w : FixedArray[Double],
  points : FixedArray[FixedArray[FixedArray[Vector4]]],
  u : Double,
  v : Double,
  w : Double,
  target : Vector3,
) -> JsResult[Vector3] =
  #| (self, degree_u, degree_v, degree_w, knots_u, knots_v, knots_w, points, u, v, w, target) => { try { return { ok: true, value: (() => self.calcVolumePoint(degree_u, degree_v, degree_w, knots_u, knots_v, knots_w, points, u, v, w, target))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSUtils::volume_point(
  self : NURBSUtils,
  degree_u : Int,
  degree_v : Int,
  degree_w : Int,
  knots_u : FixedArray[Double],
  knots_v : FixedArray[Double],
  knots_w : FixedArray[Double],
  points : FixedArray[FixedArray[FixedArray[Vector4]]],
  u : Double,
  v : Double,
  w : Double,
  target : Vector3,
) -> Vector3 raise ModelingError {
  match
    self
    .ffi_volume_point(
      degree_u, degree_v, degree_w, knots_u, knots_v, knots_w, points, u, v, w, target,
    )
    .into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}