// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/hr-time

///|
/// DOMHighResTimeStamp typedef
pub type DOMHighResTimeStamp = Double

///|
/// EpochTimeStamp typedef
pub type EpochTimeStamp = Int64

///|
/// Performance interface
pub type Performance

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

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

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

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

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

///|
pub extern "js" fn Performance::to_event_target(
  self : Performance,
) -> EventTarget =
  #| (self) => self

///|
/// Error type for throwing methods
pub(all) enum PerformanceMeasureUserAgentSpecificMemoryError {
  SecurityError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum PerformanceMarkError {
  TypeError(JsError)
  SyntaxError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum PerformanceMeasureError {
  TypeError(JsError)
  RangeError(JsError)
  SyntaxError(JsError)
  DataCloneError(JsError)
  OtherError(JsError)
} derive(Show)

///|
pub extern "js" fn Performance::now(self : Performance) -> DOMHighResTimeStamp =
  #| (self) => self.now()

///|
pub extern "js" fn Performance::get_time_origin(
  self : Performance,
) -> DOMHighResTimeStamp =
  #| (self) => self.timeOrigin

///|
pub extern "js" fn Performance::to_json(self : Performance) -> JsValue =
  #| (self) => self.toJSON()

///|
pub extern "js" fn Performance::get_event_counts(
  self : Performance,
) -> EventCounts =
  #| (self) => self.eventCounts

///|
pub extern "js" fn Performance::get_interaction_count(
  self : Performance,
) -> Int64 =
  #| (self) => (() => { const n = self.interactionCount; return { hi: Math.floor(n / 4294967296), lo: n >>> 0 }; })()

///|
pub extern "js" fn Performance::get_timing(
  self : Performance,
) -> PerformanceTiming =
  #| (self) => self.timing

///|
pub extern "js" fn Performance::get_navigation(
  self : Performance,
) -> PerformanceNavigation =
  #| (self) => self.navigation

///|
pub extern "js" fn Performance::measure_user_agent_specific_memory(
  self : Performance,
) -> Promise[
  Result[MemoryMeasurement, PerformanceMeasureUserAgentSpecificMemoryError],
] =
  #| (self) => self.measureUserAgentSpecificMemory().then(v => ({
  #|   bytes: v.bytes,
  #|   breakdown: (v.breakdown === undefined ? { $tag: 0 } : { $tag: 1, _0: v.breakdown })
  #| })).then(r => ({ $tag: 1, _0: r })).catch(e => ({ $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'SecurityError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }))

///|
pub extern "js" fn Performance::get_entries(
  self : Performance,
) -> PerformanceEntryList =
  #| (self) => self.getEntries()

///|
pub extern "js" fn Performance::get_entries_by_type(
  self : Performance,
  type_ : String,
) -> PerformanceEntryList =
  #| (self, type_) => self.getEntriesByType(type_)

///|
pub extern "js" fn Performance::get_entries_by_name(
  self : Performance,
  name : String,
) -> PerformanceEntryList =
  #| (self, name) => self.getEntriesByName(name)

///|
pub extern "js" fn Performance::get_entries_by_name_with_type(
  self : Performance,
  name : String,
  type_ : String,
) -> PerformanceEntryList =
  #| (self, name, type_) => self.getEntriesByName(name, type_)

///|
pub extern "js" fn Performance::clear_resource_timings(
  self : Performance,
) -> Unit =
  #| (self) => self.clearResourceTimings()

///|
pub extern "js" fn Performance::set_resource_timing_buffer_size(
  self : Performance,
  max_size : Int,
) -> Unit =
  #| (self, max_size) => self.setResourceTimingBufferSize(max_size)

///|
pub extern "js" fn Performance::set_onresourcetimingbufferfull(
  self : Performance,
  handler : (Event) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onresourcetimingbufferfull = (e) => handler(e) }

///|
pub extern "js" fn Performance::clear_onresourcetimingbufferfull(
  self : Performance,
) -> Unit =
  #| (self) => { self.onresourcetimingbufferfull = null }

///|
pub extern "js" fn Performance::mark(
  self : Performance,
  mark_name : String,
) -> Result[PerformanceMark, PerformanceMarkError] =
  #| (self, mark_name) => (() => { try { return { $tag: 1, _0: self.mark(mark_name) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'SyntaxError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
extern "js" fn Performance::mark_with_mark_options_ffi(
  self : Performance,
  mark_name : String,
  mark_options : JsValue,
) -> Result[PerformanceMark, PerformanceMarkError] =
  #| (self, mark_name, mark_options) => (() => { try { return { $tag: 1, _0: self.mark(mark_name, mark_options) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'SyntaxError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub fn Performance::mark_with_mark_options(
  self : Performance,
  mark_name : String,
  mark_options : PerformanceMarkOptions,
) -> Result[PerformanceMark, PerformanceMarkError] {
  Performance::mark_with_mark_options_ffi(self, mark_name, mark_options.to_js())
}

///|
pub extern "js" fn Performance::clear_marks(self : Performance) -> Unit =
  #| (self) => self.clearMarks()

///|
pub extern "js" fn Performance::clear_marks_with_mark_name(
  self : Performance,
  mark_name : String,
) -> Unit =
  #| (self, mark_name) => self.clearMarks(mark_name)

///|
pub extern "js" fn Performance::measure(
  self : Performance,
  measure_name : String,
) -> Result[PerformanceMeasure, PerformanceMeasureError] =
  #| (self, measure_name) => (() => { try { return { $tag: 1, _0: self.measure(measure_name) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'RangeError') return { $tag: 1, _0: e }; if (n === 'SyntaxError') return { $tag: 2, _0: e }; if (n === 'DataCloneError') return { $tag: 3, _0: e }; return { $tag: 4, _0: e }; })() }; } })()

///|
pub extern "js" fn Performance::measure_with_end_mark(
  self : Performance,
  measure_name : String,
  start_or_measure_options : StringOrPerformanceMeasureOptions,
  end_mark : String,
) -> Result[PerformanceMeasure, PerformanceMeasureError] =
  #| (self, measure_name, start_or_measure_options, end_mark) => (() => { try { return { $tag: 1, _0: self.measure(measure_name, start_or_measure_options, end_mark) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; if (n === 'RangeError') return { $tag: 1, _0: e }; if (n === 'SyntaxError') return { $tag: 2, _0: e }; if (n === 'DataCloneError') return { $tag: 3, _0: e }; return { $tag: 4, _0: e }; })() }; } })()

///|
pub extern "js" fn Performance::clear_measures(self : Performance) -> Unit =
  #| (self) => self.clearMeasures()

///|
pub extern "js" fn Performance::clear_measures_with_measure_name(
  self : Performance,
  measure_name : String,
) -> Unit =
  #| (self, measure_name) => self.clearMeasures(measure_name)