// ===== EtfTerm:Erlang 项值的 MoonBit 表示(骨架 v0 覆盖面)=====
// 覆盖用户清单:Atom/Integer/Float/List/Tuple/Map/Binary/PID/Port/Reference。
// EString=STRING_EXT( latin1 list 快捷形);ENil=NIL_EXT(列表尾)。

///|
pub(all) enum EtfTerm {
  EAtom(String) // 97/100/115/118/119——latin1/utf8 atom 四形归一
  EInt(Int32) // 97/98(small/32bit)
  EFloat(Double) // 70/99/110(NEW_FLOAT 为主)
  EList(Array[EtfTerm]) // 108 LIST + 106 nil 尾(规约:proper list)
  ETuple(Array[EtfTerm]) // 104/105
  EMap(Array[(EtfTerm, EtfTerm)]) // 116 键值对保序
  EBinary(Bytes) // 109
  EString(String) // 107(latin1 串——整数字节列快捷形)
  EPid(String, Int32, Int32, Int32) // 88/103:node, id, serial, creation
  EPort(String, Int32, Int32) // 89/102:node, id, creation
  ERef(String, Int32, Int32, Int32) // 90/114:node, id, serial(骨架恒 0), creation
  ENil // 106(空列表尾)
}

///|
/// 文本面(罐测输出用;手写防 0079 晋升+零依赖)
pub fn EtfTerm::show(self : EtfTerm) -> String {
  match self {
    EtfTerm::EAtom(s) => "Atom(\{s})"
    EtfTerm::EInt(v) => "Int(\{v})"
    EtfTerm::EFloat(f) => "Float(\{f})"
    EtfTerm::EList(items) => {
      let parts : Array[String] = []
      for it in items {
        parts.push(it.show())
      }
      "[\{parts.join(",")}]"
    }
    EtfTerm::ETuple(items) => {
      let parts : Array[String] = []
      for it in items {
        parts.push(it.show())
      }
      "{\{parts.join(",")}}"
    }
    EtfTerm::EMap(pairs) => {
      let parts : Array[String] = []
      for pr in pairs {
        parts.append([pr.0.show(), " => ", pr.1.show()])
      }
      "#\{parts.join(",")}"
    }
    EtfTerm::EBinary(_) => "Binary(..)"
    EtfTerm::EString(s) => "String(\{s})"
    EtfTerm::EPid(node, id, serial, creation) =>
      "Pid(\{node},\{id},\{serial},\{creation})"
    EtfTerm::EPort(node, id, creation) => "Port(\{node},\{id},\{creation})"
    EtfTerm::ERef(node, id, serial, creation) =>
      "Ref(\{node},\{id},\{serial},\{creation})"
    EtfTerm::ENil => "nil"
  }
}

///|
/// VERSION_MAGIC(版本面非 tag 词表面;tag 词表真源=protocol/etf_tags.toml,
/// 产物=gen_tags.mbt——勿手改,改词表后由 erlgen 再生)
pub const VERSION_MAGIC : Int32 = 131