///|
fn init_readline() -> Unit {
  init_readline_internal()
}

///|
fn question_ffi(question : String, callback : (String) -> Unit) -> Unit {
  let bytes = @encoding/utf8.encode(question)
  let result_ptr = question_ffi_internal(bytes)
  let result_bytes = result_ptr[0:-1] // 去除 \u{00}
  // 去除末尾的 null 字符
  if (try? @encoding/utf8.decode(result_bytes)) is Ok(text) {
    callback(text)
  } else {
    callback("")
  }
}

///|
fn wait_for_completion() -> Unit {
  wait_for_completion_internal()
}

///|
fn close_ffi() -> Unit {
  close_ffi_internal()
}

///|
extern "c" fn init_readline_internal() -> Unit = "init_readline_internal"

///|
#owned(question)
extern "c" fn question_ffi_internal(question : Bytes) -> Bytes = "question_ffi_internal"

///|
extern "c" fn close_ffi_internal() -> Unit = "close_ffi_internal"

///|
extern "c" fn wait_for_completion_internal() -> Unit = "wait_for_completion_internal"