///|
/// MainContext - event source context.
/// Automatically unreffed when garbage collected.
pub type MainContext

///|
extern "c" fn moonbit_glib_main_context_new() -> MainContext = "moonbit_glib_main_context_new"

///|
extern "c" fn moonbit_glib_main_context_default() -> MainContext = "moonbit_glib_main_context_default"

///|
#borrow(ctx)
extern "c" fn moonbit_glib_main_context_iteration(
  ctx : MainContext,
  may_block : Bool,
) -> Bool = "moonbit_glib_main_context_iteration"

///|
#borrow(ctx)
extern "c" fn moonbit_glib_main_context_pending(ctx : MainContext) -> Bool = "moonbit_glib_main_context_pending"

///|
#borrow(ctx)
extern "c" fn moonbit_glib_main_context_wakeup(ctx : MainContext) -> Unit = "moonbit_glib_main_context_wakeup"

///|
/// Create a new MainContext.
///
/// # Example
///
/// ```mbt check
/// test {
///   let ctx = @glib.MainContext::new()
///   assert_false(ctx.pending())
/// }
/// ```
pub fn MainContext::new() -> MainContext {
  moonbit_glib_main_context_new()
}

///|
/// Get the global default MainContext.
pub fn MainContext::default() -> MainContext {
  moonbit_glib_main_context_default()
}

///|
/// Run a single iteration. Returns true if events were dispatched.
pub fn MainContext::iteration(self : MainContext, may_block : Bool) -> Bool {
  moonbit_glib_main_context_iteration(self, may_block)
}

///|
/// Check if there are pending events.
pub fn MainContext::pending(self : MainContext) -> Bool {
  moonbit_glib_main_context_pending(self)
}

///|
/// Wake up the context if blocked in a poll.
pub fn MainContext::wakeup(self : MainContext) -> Unit {
  moonbit_glib_main_context_wakeup(self)
}