///|
priv struct WgslIrCompatWriterBackend {
  shader_module : Module
  view : WgslIrWriterModule
}

///|
fn emit_wgsl_module_with_compat_writer_backend(
  shader_module : Module,
  root_items : Array[String]?,
  compatibility : WgslNagaCompatibilityView,
) -> String raise WgslIrEmitError {
  let backend = WgslIrCompatWriterBackend::{
    shader_module,
    view: build_wgsl_ir_writer_module(shader_module, root_items, compatibility~),
  }
  backend.emit()
}

///|
fn WgslIrCompatWriterBackend::emit(
  self : WgslIrCompatWriterBackend,
) -> String raise WgslIrEmitError {
  self.validate()
  self.emitter().emit_module()
}

///|
fn WgslIrCompatWriterBackend::validate(
  self : WgslIrCompatWriterBackend,
) -> Unit raise WgslIrEmitError {
  ignore(self.view.filter)
  validate_wgsl_ir_module(self.shader_module) catch {
    error => raise Unsupported(error.message())
  }
}

///|
fn WgslIrCompatWriterBackend::emitter(
  self : WgslIrCompatWriterBackend,
) -> WgslIrEmitter {
  {
    shader_module: self.shader_module,
    options: WgslIrEmitOptions::compat_writer(),
    writer_module: self.view,
    names: self.view.names,
    current_function_origin: None,
    compat_negative_zero_seen: false,
    emitted_function_named_expressions: Set([]),
    emitted_function_materialized_expressions: Set([]),
  }
}