// Do not edit. This file is generated.
// MoonBit type: TrackEvent
// Specifications: html.idl

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

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

///|
pub impl FromJsAny for TrackEvent with from_js_any(value : JsAny) -> TrackEvent = "%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 : TTrackEvent] TrackEvent::into(self : TrackEvent) -> 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 : TTrackEvent] TrackEvent::unsafe_into(self : TrackEvent) -> T = "%identity"

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

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

///|
pub impl TTrackEvent for TrackEvent

///|
pub impl TEvent for TrackEvent

///|
pub fn TrackEvent::new(
  type_ : String,
  event_init_dict? : TrackEventInit,
) -> TrackEvent {
  track_event_new_ffi(TJsValue::to_js(type_), opt_to_js(event_init_dict))
}

///|
pub(open) trait TTrackEventTrack: TJsValue {}

///|
pub impl TTrackEventTrack for VideoTrack

///|
pub impl TTrackEventTrack for AudioTrack

///|
pub impl TTrackEventTrack for TextTrack

///|
#external
pub type TrackEventTrack

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

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

///|
#deprecated("Use unsafe_into or try_into instead")
pub fn[T : TTrackEventTrack + FromJsAny] TrackEventTrack::into(
  self : TrackEventTrack,
) -> T {
  FromJsAny::from_js_any(jsvalue_to_jsany(TJsValue::to_js(self)))
}

///|
pub fn[T : TTrackEventTrack + FromJsAny] TrackEventTrack::unsafe_into(
  self : TrackEventTrack,
) -> T {
  FromJsAny::from_js_any(jsvalue_to_jsany(TJsValue::to_js(self)))
}

///|
pub fn[T : TTrackEventTrack] TrackEventTrack::from(
  value : T,
) -> TrackEventTrack = "%identity"

///|
pub impl TTrackEventTrack for TrackEventTrack

///|
/// [TrackEvent](https://developer.mozilla.org/en-US/docs/Web/API/TrackEvent) interface.
pub trait TTrackEvent: TEvent {
  track(self : Self) -> TrackEventTrack = _
}

///|
/// [TrackEvent.track](https://developer.mozilla.org/en-US/docs/Web/API/TrackEvent/track)
impl TTrackEvent with track(self : Self) -> TrackEventTrack {
  track_event_track_ffi(TJsValue::to_js(self))
}

///|
#cfg(target="js")
extern "js" fn track_event_new_ffi(
  type_ : JsValue,
  event_init_dict : JsValue,
) -> TrackEvent = "(type_, event_init_dict) => new TrackEvent(type_, event_init_dict)"

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

///|
#cfg(target="js")
fn track_event_track_ffi(obj : JsValue) -> TrackEventTrack {
  track_event_track_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn track_event_new_ffi(
  type_ : JsValue,
  event_init_dict : JsValue,
) -> TrackEvent = "webapi_TrackEvent" "new"

///|
#cfg(target="wasm-gc")
fn track_event_track_ffi_wasm(obj : JsValue) -> JsValue = "webapi_TrackEvent" "get_track"

///|
#cfg(target="wasm-gc")
fn track_event_track_ffi(obj : JsValue) -> TrackEventTrack {
  track_event_track_ffi_wasm(obj).unsafe_cast()
}