///|
pub(all) enum UnicodeScriptKind {
  UnicodeSubscript
  UnicodeSuperscript
} derive(Eq)

///|
pub struct UnicodeScript {
  replacement : String
  kind : UnicodeScriptKind
}

///|
let unicode_scripts : Map[String, UnicodeScript] = Map::from_array([
  ("₊", { replacement: "+", kind: UnicodeSubscript }),
  ("₋", { replacement: "-", kind: UnicodeSubscript }),
  ("₌", { replacement: "=", kind: UnicodeSubscript }),
  ("₍", { replacement: "(", kind: UnicodeSubscript }),
  ("₎", { replacement: ")", kind: UnicodeSubscript }),
  ("₀", { replacement: "0", kind: UnicodeSubscript }),
  ("₁", { replacement: "1", kind: UnicodeSubscript }),
  ("₂", { replacement: "2", kind: UnicodeSubscript }),
  ("₃", { replacement: "3", kind: UnicodeSubscript }),
  ("₄", { replacement: "4", kind: UnicodeSubscript }),
  ("₅", { replacement: "5", kind: UnicodeSubscript }),
  ("₆", { replacement: "6", kind: UnicodeSubscript }),
  ("₇", { replacement: "7", kind: UnicodeSubscript }),
  ("₈", { replacement: "8", kind: UnicodeSubscript }),
  ("₉", { replacement: "9", kind: UnicodeSubscript }),
  ("ₐ", { replacement: "a", kind: UnicodeSubscript }),
  ("ₑ", { replacement: "e", kind: UnicodeSubscript }),
  ("ₕ", { replacement: "h", kind: UnicodeSubscript }),
  ("ᵢ", { replacement: "i", kind: UnicodeSubscript }),
  ("ⱼ", { replacement: "j", kind: UnicodeSubscript }),
  ("ₖ", { replacement: "k", kind: UnicodeSubscript }),
  ("ₗ", { replacement: "l", kind: UnicodeSubscript }),
  ("ₘ", { replacement: "m", kind: UnicodeSubscript }),
  ("ₙ", { replacement: "n", kind: UnicodeSubscript }),
  ("ₒ", { replacement: "o", kind: UnicodeSubscript }),
  ("ₚ", { replacement: "p", kind: UnicodeSubscript }),
  ("ᵣ", { replacement: "r", kind: UnicodeSubscript }),
  ("ₛ", { replacement: "s", kind: UnicodeSubscript }),
  ("ₜ", { replacement: "t", kind: UnicodeSubscript }),
  ("ᵤ", { replacement: "u", kind: UnicodeSubscript }),
  ("ᵥ", { replacement: "v", kind: UnicodeSubscript }),
  ("ₓ", { replacement: "x", kind: UnicodeSubscript }),
  ("ᵦ", { replacement: "β", kind: UnicodeSubscript }),
  ("ᵧ", { replacement: "γ", kind: UnicodeSubscript }),
  ("ᵨ", { replacement: "ρ", kind: UnicodeSubscript }),
  ("ᵩ", { replacement: "ϕ", kind: UnicodeSubscript }),
  ("ᵪ", { replacement: "χ", kind: UnicodeSubscript }),
  ("⁺", { replacement: "+", kind: UnicodeSuperscript }),
  ("⁻", { replacement: "-", kind: UnicodeSuperscript }),
  ("⁼", { replacement: "=", kind: UnicodeSuperscript }),
  ("⁽", { replacement: "(", kind: UnicodeSuperscript }),
  ("⁾", { replacement: ")", kind: UnicodeSuperscript }),
  ("⁰", { replacement: "0", kind: UnicodeSuperscript }),
  ("¹", { replacement: "1", kind: UnicodeSuperscript }),
  ("²", { replacement: "2", kind: UnicodeSuperscript }),
  ("³", { replacement: "3", kind: UnicodeSuperscript }),
  ("⁴", { replacement: "4", kind: UnicodeSuperscript }),
  ("⁵", { replacement: "5", kind: UnicodeSuperscript }),
  ("⁶", { replacement: "6", kind: UnicodeSuperscript }),
  ("⁷", { replacement: "7", kind: UnicodeSuperscript }),
  ("⁸", { replacement: "8", kind: UnicodeSuperscript }),
  ("⁹", { replacement: "9", kind: UnicodeSuperscript }),
  ("ᴬ", { replacement: "A", kind: UnicodeSuperscript }),
  ("ᴮ", { replacement: "B", kind: UnicodeSuperscript }),
  ("ᴰ", { replacement: "D", kind: UnicodeSuperscript }),
  ("ᴱ", { replacement: "E", kind: UnicodeSuperscript }),
  ("ᴳ", { replacement: "G", kind: UnicodeSuperscript }),
  ("ᴴ", { replacement: "H", kind: UnicodeSuperscript }),
  ("ᴵ", { replacement: "I", kind: UnicodeSuperscript }),
  ("ᴶ", { replacement: "J", kind: UnicodeSuperscript }),
  ("ᴷ", { replacement: "K", kind: UnicodeSuperscript }),
  ("ᴸ", { replacement: "L", kind: UnicodeSuperscript }),
  ("ᴹ", { replacement: "M", kind: UnicodeSuperscript }),
  ("ᴺ", { replacement: "N", kind: UnicodeSuperscript }),
  ("ᴼ", { replacement: "O", kind: UnicodeSuperscript }),
  ("ᴾ", { replacement: "P", kind: UnicodeSuperscript }),
  ("ᴿ", { replacement: "R", kind: UnicodeSuperscript }),
  ("ᵀ", { replacement: "T", kind: UnicodeSuperscript }),
  ("ᵁ", { replacement: "U", kind: UnicodeSuperscript }),
  ("ⱽ", { replacement: "V", kind: UnicodeSuperscript }),
  ("ᵂ", { replacement: "W", kind: UnicodeSuperscript }),
  ("ᵃ", { replacement: "a", kind: UnicodeSuperscript }),
  ("ᵇ", { replacement: "b", kind: UnicodeSuperscript }),
  ("ᶜ", { replacement: "c", kind: UnicodeSuperscript }),
  ("ᵈ", { replacement: "d", kind: UnicodeSuperscript }),
  ("ᵉ", { replacement: "e", kind: UnicodeSuperscript }),
  ("ᶠ", { replacement: "f", kind: UnicodeSuperscript }),
  ("ᵍ", { replacement: "g", kind: UnicodeSuperscript }),
  ("ʰ", { replacement: "h", kind: UnicodeSuperscript }),
  ("ⁱ", { replacement: "i", kind: UnicodeSuperscript }),
  ("ʲ", { replacement: "j", kind: UnicodeSuperscript }),
  ("ᵏ", { replacement: "k", kind: UnicodeSuperscript }),
  ("ˡ", { replacement: "l", kind: UnicodeSuperscript }),
  ("ᵐ", { replacement: "m", kind: UnicodeSuperscript }),
  ("ⁿ", { replacement: "n", kind: UnicodeSuperscript }),
  ("ᵒ", { replacement: "o", kind: UnicodeSuperscript }),
  ("ᵖ", { replacement: "p", kind: UnicodeSuperscript }),
  ("ʳ", { replacement: "r", kind: UnicodeSuperscript }),
  ("ˢ", { replacement: "s", kind: UnicodeSuperscript }),
  ("ᵗ", { replacement: "t", kind: UnicodeSuperscript }),
  ("ᵘ", { replacement: "u", kind: UnicodeSuperscript }),
  ("ᵛ", { replacement: "v", kind: UnicodeSuperscript }),
  ("ʷ", { replacement: "w", kind: UnicodeSuperscript }),
  ("ˣ", { replacement: "x", kind: UnicodeSuperscript }),
  ("ʸ", { replacement: "y", kind: UnicodeSuperscript }),
  ("ᶻ", { replacement: "z", kind: UnicodeSuperscript }),
  ("ᵝ", { replacement: "β", kind: UnicodeSuperscript }),
  ("ᵞ", { replacement: "γ", kind: UnicodeSuperscript }),
  ("ᵟ", { replacement: "δ", kind: UnicodeSuperscript }),
  ("ᵠ", { replacement: "ϕ", kind: UnicodeSuperscript }),
  ("ᵡ", { replacement: "χ", kind: UnicodeSuperscript }),
  ("ᶿ", { replacement: "θ", kind: UnicodeSuperscript }),
])

///|
fn lookup_unicode_script(text : String) -> UnicodeScript? {
  unicode_scripts.get(text)
}

///|
/// Returns the Unicode superscript or subscript character for `replacement`.
///
/// The parser and renderers share `unicode_scripts` as the canonical table.
pub fn unicode_script_character(
  kind : UnicodeScriptKind,
  replacement : String,
) -> String? {
  for character, script in unicode_scripts {
    if script.kind == kind && script.replacement == replacement {
      return Some(character)
    }
  }
  None
}