// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/touch-events

///|
/// TouchType enum
pub(all) enum TouchType {
  Direct
  Stylus
} derive(Eq, Show)

///|
/// Convert to string value
pub fn TouchType::to_string(self : TouchType) -> String {
  match self {
    TouchType::Direct => "direct"
    TouchType::Stylus => "stylus"
  }
}

///|
/// Parse from string value
pub fn TouchType::from_string(s : String) -> TouchType? {
  match s {
    "direct" => Some(TouchType::Direct)
    "stylus" => Some(TouchType::Stylus)
    _ => None
  }
}

///|
/// TouchInit dictionary
pub(all) struct TouchInit {
  identifier : Int
  target : EventTarget
  clientX : Double?
  clientY : Double?
  screenX : Double?
  screenY : Double?
  pageX : Double?
  pageY : Double?
  radiusX : Double?
  radiusY : Double?
  rotationAngle : Double?
  force : Double?
  altitudeAngle : Double?
  azimuthAngle : Double?
  touchType : TouchType?
}

///|
/// Create a new TouchInit
pub fn TouchInit::new(target~ : EventTarget) -> TouchInit {
  TouchInit::{
    identifier: 0,
    target,
    clientX: None,
    clientY: None,
    screenX: None,
    screenY: None,
    pageX: None,
    pageY: None,
    radiusX: None,
    radiusY: None,
    rotationAngle: None,
    force: None,
    altitudeAngle: None,
    azimuthAngle: None,
    touchType: None,
  }
}

///|
extern "js" fn TouchInit::to_js_ffi(self : TouchInit) -> JsValue =
  #| (self) => ({
  #|   identifier: self.identifier,
  #|   target: self.target,
  #|   clientX: ((() => { const v = self.clientX; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   clientY: ((() => { const v = self.clientY; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   screenX: ((() => { const v = self.screenX; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   screenY: ((() => { const v = self.screenY; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   pageX: ((() => { const v = self.pageX; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   pageY: ((() => { const v = self.pageY; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   radiusX: ((() => { const v = self.radiusX; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   radiusY: ((() => { const v = self.radiusY; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   rotationAngle: ((() => { const v = self.rotationAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   force: ((() => { const v = self.force; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   altitudeAngle: ((() => { const v = self.altitudeAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   azimuthAngle: ((() => { const v = self.azimuthAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   touchType: ((() => { const v = self.touchType; if (v === undefined) return undefined; return ['direct', 'stylus'][v]; })())
  #| })

///|
/// Convert to JsValue
pub fn TouchInit::to_js(self : TouchInit) -> JsValue {
  TouchInit::to_js_ffi(self)
}

///|
extern "js" fn TouchInit::from_js_ffi(value : JsValue) -> TouchInit =
  #| (v) => ({
  #|   identifier: v.identifier,
  #|   target: v.target,
  #|   clientX: (v.clientX === undefined ? { $tag: 0 } : { $tag: 1, _0: v.clientX }),
  #|   clientY: (v.clientY === undefined ? { $tag: 0 } : { $tag: 1, _0: v.clientY }),
  #|   screenX: (v.screenX === undefined ? { $tag: 0 } : { $tag: 1, _0: v.screenX }),
  #|   screenY: (v.screenY === undefined ? { $tag: 0 } : { $tag: 1, _0: v.screenY }),
  #|   pageX: (v.pageX === undefined ? { $tag: 0 } : { $tag: 1, _0: v.pageX }),
  #|   pageY: (v.pageY === undefined ? { $tag: 0 } : { $tag: 1, _0: v.pageY }),
  #|   radiusX: (v.radiusX === undefined ? { $tag: 0 } : { $tag: 1, _0: v.radiusX }),
  #|   radiusY: (v.radiusY === undefined ? { $tag: 0 } : { $tag: 1, _0: v.radiusY }),
  #|   rotationAngle: (v.rotationAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.rotationAngle }),
  #|   force: (v.force === undefined ? { $tag: 0 } : { $tag: 1, _0: v.force }),
  #|   altitudeAngle: (v.altitudeAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.altitudeAngle }),
  #|   azimuthAngle: (v.azimuthAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.azimuthAngle }),
  #|   touchType: (v.touchType === undefined ? undefined : ['direct', 'stylus'].indexOf(v.touchType))
  #| })

///|
/// Convert from JsValue
pub fn TouchInit::from_js(value : JsValue) -> TouchInit {
  TouchInit::from_js_ffi(value)
}

///|
/// TouchEventInit dictionary
pub(all) struct TouchEventInit {
  touches : Array[Touch]?
  targetTouches : Array[Touch]?
  changedTouches : Array[Touch]?
}

///|
/// Create a new TouchEventInit with default values
pub fn TouchEventInit::default() -> TouchEventInit {
  TouchEventInit::{ touches: None, targetTouches: None, changedTouches: None }
}

///|
extern "js" fn TouchEventInit::to_js_ffi(self : TouchEventInit) -> JsValue =
  #| (self) => ({
  #|   touches: ((() => { const v = self.touches; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   targetTouches: ((() => { const v = self.targetTouches; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   changedTouches: ((() => { const v = self.changedTouches; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn TouchEventInit::to_js(self : TouchEventInit) -> JsValue {
  TouchEventInit::to_js_ffi(self)
}

///|
extern "js" fn TouchEventInit::from_js_ffi(value : JsValue) -> TouchEventInit =
  #| (v) => ({
  #|   touches: (v.touches === undefined ? { $tag: 0 } : { $tag: 1, _0: v.touches }),
  #|   targetTouches: (v.targetTouches === undefined ? { $tag: 0 } : { $tag: 1, _0: v.targetTouches }),
  #|   changedTouches: (v.changedTouches === undefined ? { $tag: 0 } : { $tag: 1, _0: v.changedTouches })
  #| })

///|
/// Convert from JsValue
pub fn TouchEventInit::from_js(value : JsValue) -> TouchEventInit {
  TouchEventInit::from_js_ffi(value)
}

///|
/// Touch interface
pub type Touch

///|
pub extern "js" fn Touch::to_js_value(self : Touch) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to Touch (unchecked)
pub extern "js" fn Touch::from_js_value(v : JsValue) -> Touch =
  #| (v) => v

///|
/// Safely cast JsValue to Touch (checked with instanceof)
pub extern "js" fn Touch::from_js_value_opt(v : JsValue) -> Touch? =
  #| (v) => (v instanceof Touch) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to Touch (checked with instanceof)
pub extern "js" fn JsValue::as_touch(self : JsValue) -> Touch? =
  #| (self) => (self instanceof Touch) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to Touch (unchecked)
pub extern "js" fn JsValue::to_touch(self : JsValue) -> Touch =
  #| (self) => self

///|
extern "js" fn Touch::new_ffi(touch_init_dict : JsValue) -> Touch =
  #| (touch_init_dict) => new Touch(touch_init_dict)

///|
pub fn Touch::new(touch_init_dict : TouchInit) -> Touch {
  Touch::new_ffi(touch_init_dict.to_js())
}

///|
pub extern "js" fn Touch::get_identifier(self : Touch) -> Int =
  #| (self) => self.identifier

///|
pub extern "js" fn Touch::get_target(self : Touch) -> EventTarget =
  #| (self) => self.target

///|
pub extern "js" fn Touch::get_screen_x(self : Touch) -> Double =
  #| (self) => self.screenX

///|
pub extern "js" fn Touch::get_screen_y(self : Touch) -> Double =
  #| (self) => self.screenY

///|
pub extern "js" fn Touch::get_client_x(self : Touch) -> Double =
  #| (self) => self.clientX

///|
pub extern "js" fn Touch::get_client_y(self : Touch) -> Double =
  #| (self) => self.clientY

///|
pub extern "js" fn Touch::get_page_x(self : Touch) -> Double =
  #| (self) => self.pageX

///|
pub extern "js" fn Touch::get_page_y(self : Touch) -> Double =
  #| (self) => self.pageY

///|
pub extern "js" fn Touch::get_radius_x(self : Touch) -> Double =
  #| (self) => self.radiusX

///|
pub extern "js" fn Touch::get_radius_y(self : Touch) -> Double =
  #| (self) => self.radiusY

///|
pub extern "js" fn Touch::get_rotation_angle(self : Touch) -> Double =
  #| (self) => self.rotationAngle

///|
pub extern "js" fn Touch::get_force(self : Touch) -> Double =
  #| (self) => self.force

///|
pub extern "js" fn Touch::get_altitude_angle(self : Touch) -> Double =
  #| (self) => self.altitudeAngle

///|
pub extern "js" fn Touch::get_azimuth_angle(self : Touch) -> Double =
  #| (self) => self.azimuthAngle

///|
pub extern "js" fn Touch::get_touch_type(self : Touch) -> TouchType =
  #| (self) => ['direct', 'stylus'].indexOf(self.touchType)

///|
/// TouchList interface
pub type TouchList

///|
pub extern "js" fn TouchList::to_js_value(self : TouchList) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to TouchList (unchecked)
pub extern "js" fn TouchList::from_js_value(v : JsValue) -> TouchList =
  #| (v) => v

///|
/// Safely cast JsValue to TouchList (checked with instanceof)
pub extern "js" fn TouchList::from_js_value_opt(v : JsValue) -> TouchList? =
  #| (v) => (v instanceof TouchList) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to TouchList (checked with instanceof)
pub extern "js" fn JsValue::as_touch_list(self : JsValue) -> TouchList? =
  #| (self) => (self instanceof TouchList) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to TouchList (unchecked)
pub extern "js" fn JsValue::to_touch_list(self : JsValue) -> TouchList =
  #| (self) => self

///|
pub extern "js" fn TouchList::get_length(self : TouchList) -> Int =
  #| (self) => self.length

///|
pub extern "js" fn TouchList::item(self : TouchList, index : Int) -> Touch? =
  #| (self, index) => (() => { const v = self.item(index); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
#alias("_[_]")
pub extern "js" fn TouchList::get(self : TouchList, index : Int) -> Touch? =
  #| (self, index) => (() => { const v = self[index]; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
/// TouchEvent interface
pub type TouchEvent

///|
pub extern "js" fn TouchEvent::to_js_value(self : TouchEvent) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to TouchEvent (unchecked)
pub extern "js" fn TouchEvent::from_js_value(v : JsValue) -> TouchEvent =
  #| (v) => v

///|
/// Safely cast JsValue to TouchEvent (checked with instanceof)
pub extern "js" fn TouchEvent::from_js_value_opt(v : JsValue) -> TouchEvent? =
  #| (v) => (v instanceof TouchEvent) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to TouchEvent (checked with instanceof)
pub extern "js" fn JsValue::as_touch_event(self : JsValue) -> TouchEvent? =
  #| (self) => (self instanceof TouchEvent) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to TouchEvent (unchecked)
pub extern "js" fn JsValue::to_touch_event(self : JsValue) -> TouchEvent =
  #| (self) => self

///|
pub extern "js" fn TouchEvent::to_ui_event(self : TouchEvent) -> UIEvent =
  #| (self) => self

///|
pub extern "js" fn TouchEvent::to_event(self : TouchEvent) -> Event =
  #| (self) => self

///|
pub extern "js" fn TouchEvent::new(type_ : String) -> TouchEvent =
  #| (type_) => new TouchEvent(type_)

///|
extern "js" fn TouchEvent::new_with_event_init_dict_ffi(
  type_ : String,
  event_init_dict : JsValue,
) -> TouchEvent =
  #| (type_, event_init_dict) => new TouchEvent(type_, event_init_dict)

///|
pub fn TouchEvent::new_with_event_init_dict(
  type_ : String,
  event_init_dict : TouchEventInit,
) -> TouchEvent {
  TouchEvent::new_with_event_init_dict_ffi(type_, event_init_dict.to_js())
}

///|
pub extern "js" fn TouchEvent::get_touches(self : TouchEvent) -> TouchList =
  #| (self) => self.touches

///|
pub extern "js" fn TouchEvent::get_target_touches(
  self : TouchEvent,
) -> TouchList =
  #| (self) => self.targetTouches

///|
pub extern "js" fn TouchEvent::get_changed_touches(
  self : TouchEvent,
) -> TouchList =
  #| (self) => self.changedTouches

///|
pub extern "js" fn TouchEvent::get_alt_key(self : TouchEvent) -> Bool =
  #| (self) => self.altKey

///|
pub extern "js" fn TouchEvent::get_meta_key(self : TouchEvent) -> Bool =
  #| (self) => self.metaKey

///|
pub extern "js" fn TouchEvent::get_ctrl_key(self : TouchEvent) -> Bool =
  #| (self) => self.ctrlKey

///|
pub extern "js" fn TouchEvent::get_shift_key(self : TouchEvent) -> Bool =
  #| (self) => self.shiftKey

///|
pub extern "js" fn TouchEvent::get_modifier_state(
  self : TouchEvent,
  key_arg : String,
) -> Bool =
  #| (self, key_arg) => self.getModifierState(key_arg)

///|
pub extern "js" fn TouchEvent::get_named(
  self : TouchEvent,
  key_arg : String,
) -> Bool =
  #| (self, key_arg) => self[key_arg]