///|
type Memory[T]

///|
fn Memory::as_pointer[T : Sized](self : Memory[T]) -> Pointer[Byte] = "%identity"

///|
pub(open) trait Sized {
  sizeof() -> Int
}

///|
fn moonbit_malloc(size : Int) -> Pointer[Unit] = "$moonbit.malloc"

///|
pub fn Memory::load[T : Sized](memory : Memory[T], offset : Int) -> T {
  let self : Pointer[Byte] = moonbit_malloc(T::sizeof()).cast()
  let pointer : Pointer[Byte] = memory.as_pointer().cast()
  let offset = offset * T::sizeof()
  for i in 0.. Unit {
  let pointer : Pointer[Byte] = memory.as_pointer().cast()
  let value : Pointer[Byte] = Nullable::some(value).as_pointer().cast()
  for i in 0..