///|
pub let string_embedded_code : Map[String, RuntimeFunction] = {
  "%string_length": string_length,
  "%string_get": string_get_fn,
  "%string.unsafe_get": string_unsafe_get_fn,
  "%string_add": string_add_fn,
  "%string_eq": string_eq_fn,
  "%string_to_string": string_to_string_fn,
}

///|
pub let string_methods : Map[String, RuntimeFunction] = {
  "length": string_length,
  "get": string_get_fn,
  "unsafe_get": string_unsafe_get_fn,
  "to_string": string_to_string_fn,
  "make": string_make_fn,
  "iter": string_iter_fn,
}

// ===== 字符串操作 =====

///| 字符串make操作
let string_make_fn : RuntimeFunction = ctx => match ctx.arguments {
  [{ val: Int(len), .. }, { val: Char(ch), .. }, ..] =>
    String(String::make(len, ch))
  _ => Unit
}

///|
let string_length : RuntimeFunction = ctx => if ctx.arguments
  is [{ val: String(s), .. }, ..] {
  Int(s.length())
} else {
  Unit
}

///| 字符串索引访问
let string_get_fn : RuntimeFunction = ctx => match ctx.arguments {
  [{ val: String(s), .. }, { val: Int(idx), .. }, ..] =>
    if idx >= 0 && idx < s.length() {
      Int(s[idx])
    } else {
      abort("string index out of bounds")
      Unit
    }
  _ => Unit
}

///| 字符串不安全索引访问
let string_unsafe_get_fn : RuntimeFunction = ctx => match ctx.arguments {
  [{ val: String(s), .. }, { val: Int(idx), .. }, ..] =>
    Int(s.unsafe_charcode_at(idx))
  _ => Unit
}

///| 字符串迭代器
let string_iter_fn : RuntimeFunction = ctx => match ctx.arguments {
  [{ val: String(str), .. }, ..] => Iter(str.iter().map(c => Char(c)))
  _ => Unit
}

///| 字符串连接
let string_add_fn : RuntimeFunction = ctx => match ctx.arguments {
  [{ val: String(a), .. }, { val: String(b), .. }, ..] => String(a + b)
  _ => Unit
}

///| 字符串相等比较
let string_eq_fn : RuntimeFunction = ctx => match ctx.arguments {
  [{ val: String(a), .. }, { val: String(b), .. }, ..] => Bool(a == b)
  _ => Bool(false)
}

///| 字符串 to_string
let string_to_string_fn : RuntimeFunction = ctx => match ctx.arguments {
  [{ val: String(s), .. }, ..] => String(s)
  _ => Unit
}