// Do not edit. This file is generated.
// MoonBit type: Transformer
// Specifications: streams.idl

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

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

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

///|
pub fn Transformer::new(
  start? : (TransformStreamDefaultController) -> JsValue,
  transform? : (JsValue, TransformStreamDefaultController) -> JsPromise[JsValue],
  flush? : (TransformStreamDefaultController) -> JsPromise[JsValue],
  cancel? : (JsValue) -> JsPromise[JsValue],
  readable_type? : JsValue,
  writable_type? : JsValue,
) -> Transformer {
  transformer_ffi(
    match start {
      Some(v) => TJsValue::to_js(transformer_start_callback_ffi(v))
      None => JsValue::undefined()
    },
    match transform {
      Some(v) => TJsValue::to_js(transformer_transform_callback_ffi(v))
      None => JsValue::undefined()
    },
    match flush {
      Some(v) => TJsValue::to_js(transformer_flush_callback_ffi(v))
      None => JsValue::undefined()
    },
    match cancel {
      Some(v) => TJsValue::to_js(transformer_cancel_callback_ffi(v))
      None => JsValue::undefined()
    },
    opt_to_js(readable_type),
    opt_to_js(writable_type),
  )
}

///|
pub fn Transformer::empty() -> Transformer {
  transformer_empty_ffi()
}

///|
pub fn Transformer::start(self : Transformer) -> TransformerStartCallback? {
  transformer_get_start_ffi(TJsValue::to_js(self)).to_option()
}

///|
pub fn Transformer::transform(
  self : Transformer,
) -> TransformerTransformCallback? {
  transformer_get_transform_ffi(TJsValue::to_js(self)).to_option()
}

///|
pub fn Transformer::flush(self : Transformer) -> TransformerFlushCallback? {
  transformer_get_flush_ffi(TJsValue::to_js(self)).to_option()
}

///|
pub fn Transformer::cancel(self : Transformer) -> TransformerCancelCallback? {
  transformer_get_cancel_ffi(TJsValue::to_js(self)).to_option()
}

///|
pub fn Transformer::readable_type(self : Transformer) -> JsValue? {
  transformer_get_readable_type_ffi(TJsValue::to_js(self)).to_option()
}

///|
pub fn Transformer::writable_type(self : Transformer) -> JsValue? {
  transformer_get_writable_type_ffi(TJsValue::to_js(self)).to_option()
}

///|
#cfg(target="js")
extern "js" fn transformer_ffi(
  start : JsValue,
  transform : JsValue,
  flush : JsValue,
  cancel : JsValue,
  readable_type : JsValue,
  writable_type : JsValue,
) -> Transformer =
  #|(start, transform, flush, cancel, readableType, writableType) => {
  #|  const obj = {};
  #|  if (start !== undefined) obj.start = start;
  #|  if (transform !== undefined) obj.transform = transform;
  #|  if (flush !== undefined) obj.flush = flush;
  #|  if (cancel !== undefined) obj.cancel = cancel;
  #|  if (readableType !== undefined) obj.readableType = readableType;
  #|  if (writableType !== undefined) obj.writableType = writableType;
  #|  return obj;
  #|}

///|
#cfg(target="js")
extern "js" fn transformer_empty_ffi() -> Transformer = "() => {}"

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

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

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

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

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

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

///|
#cfg(target="wasm-gc")
fn transformer_ffi(
  start : JsValue,
  transform : JsValue,
  flush : JsValue,
  cancel : JsValue,
  readable_type : JsValue,
  writable_type : JsValue,
) -> Transformer = "webapi_Transformer" "new"

///|
#cfg(target="wasm-gc")
fn transformer_empty_ffi() -> Transformer = "webapi_Dictionary" "empty"

///|
#cfg(target="wasm-gc")
fn transformer_get_start_ffi(obj : JsValue) -> JsValue = "webapi_Transformer" "get_start"

///|
#cfg(target="wasm-gc")
fn transformer_get_transform_ffi(obj : JsValue) -> JsValue = "webapi_Transformer" "get_transform"

///|
#cfg(target="wasm-gc")
fn transformer_get_flush_ffi(obj : JsValue) -> JsValue = "webapi_Transformer" "get_flush"

///|
#cfg(target="wasm-gc")
fn transformer_get_cancel_ffi(obj : JsValue) -> JsValue = "webapi_Transformer" "get_cancel"

///|
#cfg(target="wasm-gc")
fn transformer_get_readable_type_ffi(obj : JsValue) -> JsValue = "webapi_Transformer" "get_readableType"

///|
#cfg(target="wasm-gc")
fn transformer_get_writable_type_ffi(obj : JsValue) -> JsValue = "webapi_Transformer" "get_writableType"