///|
/// 持有一个 native `EditLine*` 及其线程局部 UTF-8 locale。
///
/// C finalizer 会先释放编辑器,再释放 locale。公开 API 无法显式关闭或检查该 owner。
priv type EditorOwner

///|
/// 创建并完整配置一个 native 编辑器 owner。
///
/// 字节数组只在本次调用期间被借用。native 代码会检查 NUL 并复制临时 C 字符串,绝不
/// 保留任何 MoonBit 缓冲区。构造成功后,owner 会强引用所连接的 History owner。
#borrow(application_name, editrc_path, history_owner)
extern "C" fn EditorOwner::new(
  application_name : Bytes,
  editrc_kind : Int,
  editrc_path : Bytes,
  editing_mode : Int,
  history_owner : HistoryOwner,
) -> EditorOwner = "readline_mbt_editor_owner_new"

///|
/// 返回编辑器 owner 中保存的稳定构造状态。
#borrow(self)
extern "C" fn EditorOwner::status(self : EditorOwner) -> Int = "readline_mbt_editor_owner_status"

///|
/// 开始一次私有、可恢复驱动的读取 session。
///
/// prompt 只在调用期间借用,native 会立即复制。成功返回非零 generation token;失败
/// 返回零,具体原因由 `session_operation_status` 和 `session_errno` 查询。completion 标志
/// 是读取开始时取得的 completer 快照,不会在 session 中途变化。
#warnings("-unused_value")
#borrow(self, prompt)
extern "C" fn EditorOwner::session_begin(
  self : EditorOwner,
  prompt : Bytes,
  completion : Bool,
) -> Int64 = "readline_mbt_editor_owner_session_begin"

///|
/// 向活跃 session 提供一段输入,并可在本段之后标记 EOF。
///
/// bytes 只在调用期间借用;需要跨调用保留的内容由 native 复制。
#warnings("-unused_value")
#borrow(self, bytes)
extern "C" fn EditorOwner::session_feed(
  self : EditorOwner,
  generation : Int64,
  bytes : Bytes,
  eof : Bool,
) -> Int = "readline_mbt_editor_owner_session_feed"

///|
#borrow(self)
extern "C" fn EditorOwner::session_take_remaining_input(
  self : EditorOwner,
  generation : Int64,
) -> Bytes = "readline_mbt_editor_owner_session_take_remaining_input"

///|
/// 驱动活跃 session,直到取得进展、需要更多输入或得到终止结果。
#warnings("-unused_value")
#borrow(self)
extern "C" fn EditorOwner::session_drive(
  self : EditorOwner,
  generation : Int64,
) -> Int = "readline_mbt_editor_owner_session_drive"

///|
/// 复制 pending completion request 中光标前的文本。
#warnings("-unused_value")
#borrow(self)
extern "C" fn EditorOwner::session_completion_before(
  self : EditorOwner,
  generation : Int64,
) -> Bytes = "readline_mbt_editor_owner_session_completion_before"

///|
/// 复制 pending completion request 中光标后的文本。
#warnings("-unused_value")
#borrow(self)
extern "C" fn EditorOwner::session_completion_after(
  self : EditorOwner,
  generation : Int64,
) -> Bytes = "readline_mbt_editor_owner_session_completion_after"

///|
/// 复制 pending completion request 中的当前词。
#warnings("-unused_value")
#borrow(self)
extern "C" fn EditorOwner::session_completion_word(
  self : EditorOwner,
  generation : Int64,
) -> Bytes = "readline_mbt_editor_owner_session_completion_word"

///|
/// 在 C/libedit 已经退栈后恢复一次同步 completion。
///
/// 候选数组、其中的每个 Bytes 和 replacement 都只在本次调用期间借用;native 会在
/// 返回前完成验证、替换、列表显示和重绘,不保留任何 MoonBit 地址。
#warnings("-unused_value")
#borrow(self, candidates, replacement)
extern "C" fn EditorOwner::session_resume_completion(
  self : EditorOwner,
  generation : Int64,
  candidates : FixedArray[Bytes],
  replacement : Bytes,
  has_replacement : Bool,
) -> Int = "readline_mbt_editor_owner_session_resume_completion"

///|
/// 复制读取结果并确定清理活跃 session。
#warnings("-unused_value")
#borrow(self)
extern "C" fn EditorOwner::session_finish(
  self : EditorOwner,
  generation : Int64,
) -> Bytes = "readline_mbt_editor_owner_session_finish"

///|
/// 取消并确定清理活跃 session;对同一 generation 重复调用保持幂等。
#warnings("-unused_value")
#borrow(self)
extern "C" fn EditorOwner::session_cancel(
  self : EditorOwner,
  generation : Int64,
) -> Int = "readline_mbt_editor_owner_session_cancel"

///|
/// 返回最近一次私有 session 操作的稳定状态。
#warnings("-unused_value")
#borrow(self)
extern "C" fn EditorOwner::session_operation_status(self : EditorOwner) -> Int = "readline_mbt_editor_owner_session_operation_status"

///|
/// 返回最近一次私有 session 操作保存的 OS error code。
#warnings("-unused_value")
#borrow(self)
extern "C" fn EditorOwner::session_errno(self : EditorOwner) -> Int = "readline_mbt_editor_owner_session_errno"

///|
/// 返回导致 owner 进入不可恢复状态的清理错误;零表示 owner 仍可使用。
#borrow(self)
extern "C" fn EditorOwner::cleanup_errno(self : EditorOwner) -> Int = "readline_mbt_editor_owner_cleanup_errno"

///|
/// 返回当前是否可以替换 MoonBit completer 注册状态。
#borrow(self)
extern "C" fn EditorOwner::can_update_completion(self : EditorOwner) -> Bool = "readline_mbt_editor_owner_can_update_completion"