///|
type Loop Bytes

///|
extern "c" fn uv_loop_make() -> Loop = "moonbit_uv_loop_make"

///|
extern "c" fn uv_loop_init(loop_ : Loop) -> Int = "moonbit_uv_loop_init"

///|
pub fn Loop::new() -> Loop raise Errno {
  let loop_ = uv_loop_make()
  let status = uv_loop_init(loop_)
  if status < 0 {
    raise Errno::of_int(status)
  }
  return loop_
}

///|
extern "c" fn uv_loop_close(loop_ : Loop) -> Int = "moonbit_uv_loop_close"

///|
pub fn Loop::close(self : Loop) -> Unit raise Errno {
  let status = uv_loop_close(self)
  if status < 0 {
    raise Errno::of_int(status)
  }
}

///|
pub(all) enum RunMode {
  Default = 0
  Once = 1
  NoWait = 2
}

///|
extern "c" fn uv_run(uv : Loop, mode : RunMode) -> Int = "moonbit_uv_run"

///|
pub fn Loop::run(self : Loop, mode : RunMode) -> Unit raise Errno {
  let status = uv_run(self, mode)
  if status < 0 {
    raise Errno::of_int(status)
  }
}

///|
extern "c" fn uv_stop(loop_ : Loop) = "moonbit_uv_stop"

///|
pub fn Loop::stop(self : Loop) -> Unit {
  uv_stop(self)
}

///|
extern "c" fn uv_walk(loop_ : Loop, walk_cb : (Handle) -> Unit) = "moonbit_uv_walk"

///|
pub fn Loop::walk(self : Loop, walk_cb : (Handle) -> Unit) -> Unit {
  uv_walk(self, walk_cb)
}

///|
extern "c" fn uv_loop_alive(loop_ : Loop) -> Int = "moonbit_uv_loop_alive"

///|
pub fn Loop::alive(loop_ : Loop) -> Bool {
  return uv_loop_alive(loop_) != 0
}