///|
type Nullable[T]

///|
extern "c" fn moonbit_glib_nullable_null() -> Nullable[Unit] = "moonbit_glib_nullable_null"

///|
pub fn[T] Nullable::null() -> Nullable[T] {
  moonbit_glib_nullable_null().cast()
}

///|
fn[T, U] Nullable::cast(self : Nullable[T]) -> Nullable[U] = "%identity"

///|
fn[T] Nullable::unsafe_of_value(value : T) -> Nullable[T] = "%identity"

///|
fn[T] Nullable::unsafe_to_value(self : Nullable[T]) -> T = "%identity"

///|
#borrow(nullable)
extern "c" fn moonbit_glib_nullable_is_null(nullable : Nullable[Unit]) -> Bool = "moonbit_glib_nullable_is_null"

///|
fn[T] Nullable::is_null(self : Nullable[T]) -> Bool {
  moonbit_glib_nullable_is_null(self.cast())
}

///|
pub fn[T] Nullable::to_option(self : Nullable[T]) -> T? {
  if self.is_null() {
    None
  } else {
    Some(self.unsafe_to_value())
  }
}

///|
pub fn[T] Nullable::some(value : T) -> Nullable[T] {
  Nullable::unsafe_of_value(value)
}