///|
/// JsArray - Opaque JavaScript array reference for FFI-safe wasm callback stubs.
/// Use this when `Array[T]` cannot be used directly in extern stub signatures.

///|
#external
pub type JsArray

///|
pub impl FromJsAny for JsArray with from_js_any(value : JsAny) -> JsArray = "%identity"

///|
#cfg(target="js")
pub impl TJsValue for JsArray with to_js(self : JsArray) -> JsValue = "%identity"

///|
/// JS backend: MoonBit Array already maps to JS Array.
#cfg(target="js")
pub fn[T : TJsValue] JsArray::from_array(items : Array[T]) -> JsArray = "%identity"

///|
/// JS backend: JsArray is directly castable to MoonBit Array.
#cfg(target="js")
pub fn[T] JsArray::to_array(self : JsArray) -> Array[T] = "%identity"

///|
#cfg(target="wasm-gc")
fn js_array_to_js_ffi(arr : JsArray) -> JsValue = "webapi_Primitives" "arrayToJs"

///|
#cfg(target="wasm-gc")
fn js_array_empty_ffi() -> JsArray = "webapi_Primitives" "arrayEmpty"

///|
#cfg(target="wasm-gc")
fn js_array_push_ffi(arr : JsArray, value : JsValue) -> Unit = "webapi_Primitives" "arrayPush"

///|
#cfg(target="wasm-gc")
fn js_array_length_ffi(arr : JsArray) -> Int = "webapi_Primitives" "arrayLength"

///|
#cfg(target="wasm-gc")
fn js_array_get_ffi(arr : JsArray, index : Int) -> JsValue = "webapi_Primitives" "arrayGet"

///|
#cfg(target="wasm-gc")
pub impl TJsValue for JsArray with to_js(self : JsArray) -> JsValue {
  js_array_to_js_ffi(self)
}

///|
/// wasm-gc backend: build a host JS array explicitly.
#cfg(target="wasm-gc")
pub fn[T : TJsValue] JsArray::from_array(items : Array[T]) -> JsArray {
  let arr = js_array_empty_ffi()
  for item in items {
    js_array_push_ffi(arr, TJsValue::to_js(item))
  }
  arr
}

///|
/// wasm-gc backend: copy host JS array items into a MoonBit array.
#cfg(target="wasm-gc")
pub fn[T] JsArray::to_array(self : JsArray) -> Array[T] {
  let len = js_array_length_ffi(self)
  let out : Array[T] = []
  for i in 0.. Array[String] {
  let len = js_array_length_ffi(self)
  let out : Array[String] = []
  for i in 0.. Array[T] {
  let len = js_array_length_ffi(self)
  let out : Array[T] = []
  for i in 0..