///|
struct TemplateReplacement {
  token : String
  value : String
}

///|
/// Replaces every occurrence of one template token in a string.
fn replace_template_token(
  template : String,
  replacement : TemplateReplacement,
) -> String {
  if replacement.token == "" {
    return template
  }
  template
  .split(replacement.token)
  .map(part => part.to_owned())
  .to_array()
  .join(replacement.value)
}

///|
/// Applies a sequence of token replacements to a JavaScript template string.
/// Replacements are processed in order, which allows later entries to build on
/// earlier substitutions when generating runtime helper scripts.
pub fn render_js_template(
  template : String,
  replacements : Array[TemplateReplacement],
) -> String {
  let mut rendered = template
  for replacement in replacements {
    rendered = replace_template_token(rendered, replacement)
  }
  rendered
}

///|
/// Creates a single token replacement entry for `render_js_template`.
/// This keeps call sites readable when several template tokens need to be
/// substituted together.
pub fn replacement(token : String, value : String) -> TemplateReplacement {
  TemplateReplacement::{ token, value }
}