///|
pub fn Composer::clear_sources(self : Composer) -> Unit {
  self.registry.clear()
  self.processed_module_cache.clear()
}

///|
pub fn Composer::register_source(
  self : Composer,
  rel_path : String,
  source : String,
) -> Unit {
  self.processed_module_cache.clear()
  ignore(self.registry.register_source(rel_path, source, None))
}

///|
pub fn Composer::register_source_files(
  self : Composer,
  files : Array[WgslSourceFile],
) -> Unit {
  self.processed_module_cache.clear()
  self.registry.register_source_files(files)
}

///|
pub fn Composer::register_source_files_checked(
  self : Composer,
  files : Array[WgslSourceFile],
) -> Array[WgslDiagnostic] {
  let diagnostics : Array[WgslDiagnostic] = []
  self.registry.register_source_files_checked(files, diagnostics)
  diagnostics
}

///|
pub fn Composer::registered_source(
  self : Composer,
  rel_path : String,
) -> String? {
  self.registry.registered_source(rel_path)
}

///|
fn Composer::new_wgsl_compose_session(
  self : Composer,
  options : WgslComposeOptions,
) -> WgslComposeSession {
  {
    defines: copy_bool_defs(options.defines),
    value_defines: copy_value_defs(options.value_defines),
    modules: self.registry.copy_import_module_paths(),
    redirects: options.redirects.copy(),
    additional_imports: copy_import_definitions(options.additional_imports),
    immediate_specializations: copy_wgsl_immediate_specializations(
      options.immediate_specializations,
    ),
    global_alias_bindings: WgslComposeBindingSet(),
    redirect_match_counts: Map([]),
    visited: Set([]),
    graph_planned_requests: Set([]),
    graph_planning_rel_paths: [],
    graph_execution_complete: false,
    emitted_virtual_functions: false,
    symbols: WgslComposeSymbolTable(),
    link_graph: WgslComposeLinkGraph(),
    semantic_facts: Map([]),
    directive_scans: Map([]),
    importless_sources: Map([]),
    directive_import_targets: Map([]),
    directive_single_import_targets: Map([]),
    semantic_reference_first_starts: Map([]),
    source_local_shader_defs: Map([]),
    source_cache_ids: Map([]),
    next_source_cache_id: 0,
    processed_modules: Map([]),
    selected_import_candidate_rel_paths: Map([]),
    import_request_plans: Map([]),
    emitted_item_import_requests: Map([]),
    active_rel_paths: [],
  }
}