// Do not edit. This file is generated.
// MoonBit type: DOMTokenList
// Specifications: dom.idl

///|
/// [DOMTokenList](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList)
#external
pub type DOMTokenList

///|
pub impl TJsValue for DOMTokenList with to_js(self : DOMTokenList) -> JsValue = "%identity"

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

///|
/// Unchecked downcast — no runtime type check is performed.
/// Prefer `try_into()` for checked downcasts.
#deprecated("Use unsafe_into or try_into instead")
pub fn[T : TDOMTokenList] DOMTokenList::into(self : DOMTokenList) -> T = "%identity"

///|
/// Unchecked downcast — no runtime type check is performed.
/// WARNING: If the underlying JS value is not of type T, this will silently
/// produce a value with incorrect type, leading to undefined behavior.
pub fn[T : TDOMTokenList] DOMTokenList::unsafe_into(self : DOMTokenList) -> T = "%identity"

///|
pub impl HasConstructor for DOMTokenList with constructor_name() {
  "DOMTokenList"
}

///|
/// Checked downcast — returns None if the JS value is not an instance of T.
pub fn[T : TDOMTokenList + HasConstructor] DOMTokenList::try_into(
  self : DOMTokenList,
) -> T? {
  if js_instanceof(TJsValue::to_js(self), T::constructor_name()) {
    Some(self.unsafe_into())
  } else {
    None
  }
}

///|
pub impl TDOMTokenList for DOMTokenList

///|
/// [DOMTokenList](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList) interface.
pub trait TDOMTokenList: TJsValue {
  length(self : Self) -> UInt = _
  item(self : Self, index : UInt) -> String? = _
  contains(self : Self, token : String) -> Bool = _
  add(self : Self, tokens : Array[String]) -> Unit = _
  remove(self : Self, tokens : Array[String]) -> Unit = _
  toggle(self : Self, token : String, force? : Bool) -> Bool = _
  replace(self : Self, token : String, new_token : String) -> Bool = _
  supports(self : Self, token : String) -> Bool = _
  value(self : Self) -> String = _
  set_value(self : Self, value : String) -> Unit = _
}

///|
/// [DOMTokenList.length](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/length)
impl TDOMTokenList with length(self : Self) -> UInt {
  dom_token_list_length_ffi(TJsValue::to_js(self))
}

///|
/// [DOMTokenList.item](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/item)
impl TDOMTokenList with item(self : Self, index : UInt) -> String? {
  dom_token_list_item_ffi(TJsValue::to_js(self), TJsValue::to_js(index)).to_option_prim()
}

///|
/// [DOMTokenList.contains](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/contains)
impl TDOMTokenList with contains(self : Self, token : String) -> Bool {
  dom_token_list_contains_ffi(TJsValue::to_js(self), TJsValue::to_js(token))
}

///|
/// [DOMTokenList.add](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/add)
impl TDOMTokenList with add(self : Self, tokens : Array[String]) -> Unit {
  dom_token_list_add_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(tokens.map(fn(v) { TJsValue::to_js(v) })),
  )
}

///|
/// [DOMTokenList.remove](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/remove)
impl TDOMTokenList with remove(self : Self, tokens : Array[String]) -> Unit {
  dom_token_list_remove_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(tokens.map(fn(v) { TJsValue::to_js(v) })),
  )
}

///|
/// [DOMTokenList.toggle](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/toggle)
impl TDOMTokenList with toggle(self : Self, token : String, force? : Bool) -> Bool {
  dom_token_list_toggle_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(token),
    opt_to_js(force),
  )
}

///|
/// [DOMTokenList.replace](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/replace)
impl TDOMTokenList with replace(self : Self, token : String, new_token : String) -> Bool {
  dom_token_list_replace_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(token),
    TJsValue::to_js(new_token),
  )
}

///|
/// [DOMTokenList.supports](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/supports)
impl TDOMTokenList with supports(self : Self, token : String) -> Bool {
  dom_token_list_supports_ffi(TJsValue::to_js(self), TJsValue::to_js(token))
}

///|
/// [DOMTokenList.value](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/value)
impl TDOMTokenList with value(self : Self) -> String {
  dom_token_list_value_ffi(TJsValue::to_js(self))
}

///|
/// [DOMTokenList.value](https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/value)
impl TDOMTokenList with set_value(self : Self, value : String) -> Unit {
  dom_token_list_set_value_ffi(TJsValue::to_js(self), TJsValue::to_js(value))
}

///|
#cfg(target="js")
extern "js" fn dom_token_list_length_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.length"

///|
#cfg(target="js")
fn dom_token_list_length_ffi(obj : JsValue) -> UInt {
  dom_token_list_length_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn dom_token_list_item_ffi(
  obj : JsValue,
  index : JsValue,
) -> JsValue = "(obj, index) => obj.item(index)"

///|
#cfg(target="js")
extern "js" fn dom_token_list_contains_ffi_js(
  obj : JsValue,
  token : JsValue,
) -> JsValue = "(obj, token) => obj.contains(token)"

///|
#cfg(target="js")
fn dom_token_list_contains_ffi(obj : JsValue, token : JsValue) -> Bool {
  dom_token_list_contains_ffi_js(obj, token).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn dom_token_list_add_ffi(obj : JsValue, tokens : JsValue) -> Unit = "(obj, tokens) => obj.add(...tokens)"

///|
#cfg(target="js")
extern "js" fn dom_token_list_remove_ffi(
  obj : JsValue,
  tokens : JsValue,
) -> Unit = "(obj, tokens) => obj.remove(...tokens)"

///|
#cfg(target="js")
extern "js" fn dom_token_list_toggle_ffi_js(
  obj : JsValue,
  token : JsValue,
  force : JsValue,
) -> JsValue = "(obj, token, force) => obj.toggle(token, force)"

///|
#cfg(target="js")
fn dom_token_list_toggle_ffi(
  obj : JsValue,
  token : JsValue,
  force : JsValue,
) -> Bool {
  dom_token_list_toggle_ffi_js(obj, token, force).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn dom_token_list_replace_ffi_js(
  obj : JsValue,
  token : JsValue,
  new_token : JsValue,
) -> JsValue = "(obj, token, new_token) => obj.replace(token, new_token)"

///|
#cfg(target="js")
fn dom_token_list_replace_ffi(
  obj : JsValue,
  token : JsValue,
  new_token : JsValue,
) -> Bool {
  dom_token_list_replace_ffi_js(obj, token, new_token).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn dom_token_list_supports_ffi_js(
  obj : JsValue,
  token : JsValue,
) -> JsValue = "(obj, token) => obj.supports(token)"

///|
#cfg(target="js")
fn dom_token_list_supports_ffi(obj : JsValue, token : JsValue) -> Bool {
  dom_token_list_supports_ffi_js(obj, token).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn dom_token_list_value_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.value"

///|
#cfg(target="js")
fn dom_token_list_value_ffi(obj : JsValue) -> String {
  dom_token_list_value_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn dom_token_list_set_value_ffi(
  obj : JsValue,
  value : JsValue,
) -> Unit = "(obj, value) => { obj.value = value; }"

///|
#cfg(target="wasm-gc")
fn dom_token_list_length_ffi(obj : JsValue) -> UInt = "webapi_DOMTokenList" "get_length"

///|
#cfg(target="wasm-gc")
fn dom_token_list_item_ffi(obj : JsValue, index : JsValue) -> JsValue = "webapi_DOMTokenList" "item"

///|
#cfg(target="wasm-gc")
fn dom_token_list_contains_ffi(obj : JsValue, token : JsValue) -> Bool = "webapi_DOMTokenList" "contains"

///|
#cfg(target="wasm-gc")
fn dom_token_list_add_ffi(obj : JsValue, tokens : JsValue) -> Unit = "webapi_DOMTokenList" "add"

///|
#cfg(target="wasm-gc")
fn dom_token_list_remove_ffi(obj : JsValue, tokens : JsValue) -> Unit = "webapi_DOMTokenList" "remove"

///|
#cfg(target="wasm-gc")
fn dom_token_list_toggle_ffi(
  obj : JsValue,
  token : JsValue,
  force : JsValue,
) -> Bool = "webapi_DOMTokenList" "toggle"

///|
#cfg(target="wasm-gc")
fn dom_token_list_replace_ffi(
  obj : JsValue,
  token : JsValue,
  new_token : JsValue,
) -> Bool = "webapi_DOMTokenList" "replace"

///|
#cfg(target="wasm-gc")
fn dom_token_list_supports_ffi(obj : JsValue, token : JsValue) -> Bool = "webapi_DOMTokenList" "supports"

///|
#cfg(target="wasm-gc")
fn dom_token_list_value_ffi_wasm(obj : JsValue) -> JsValue = "webapi_DOMTokenList" "get_value"

///|
#cfg(target="wasm-gc")
fn dom_token_list_value_ffi(obj : JsValue) -> String {
  jsvalue_to_string(dom_token_list_value_ffi_wasm(obj))
}

///|
#cfg(target="wasm-gc")
fn dom_token_list_set_value_ffi(obj : JsValue, value : JsValue) -> Unit = "webapi_DOMTokenList" "set_value"