nominal cell_array = array_base (mut {value : heap {value : i32 * string} * heap {value : i32 * string}})

inl create (n : i32) : cell_array = cell_array !!!!ArrayCreate(`(mut {value : heap {value : i32 * string} * heap {value : i32 * string}}), n)
inl get (array : cell_array) (i : i32) : mut {value : heap {value : i32 * string} * heap {value : i32 * string}} =
    match array with
    | cell_array values => !!!!ArrayIndex(values, i)
inl set (array : cell_array) (i : i32) (value : mut {value : heap {value : i32 * string} * heap {value : i32 * string}}) : () =
    match array with
    | cell_array values => !!!!ArrayIndexSet(values, i, value)

inl main () : i32 =
    inl ~n = 1i32
    inl ~word = "no"
    inl left_pair = n, word
    inl left_heap = !!!!LayoutToHeap({value = left_pair})
    inl ~m = 2i32
    inl ~other = "zz"
    inl right_pair = m, other
    inl right_heap = !!!!LayoutToHeap({value = right_pair})
    inl cell : mut {value : heap {value : i32 * string} * heap {value : i32 * string}} = !!!!LayoutToHeapMutable({value = left_heap, right_heap})
    inl a = create 1i32
    set a 0i32 cell
    inl ~a0 = 7i32
    inl ~b0 = "hi"
    inl next_left_pair = a0, b0
    inl next_left = !!!!LayoutToHeap({value = next_left_pair})
    inl ~c0 = 4i32
    inl ~d0 = "yo"
    inl next_right_pair = c0, d0
    inl next_right = !!!!LayoutToHeap({value = next_right_pair})
    inl replaced = next_left, next_right
    inl held = get a 0i32
    held <- {value = replaced}
    inl opened = !!!!LayoutIndex(held)
    inl ~(left, right) = opened.value
    inl left_opened = !!!!LayoutIndex(left)
    inl ~(p, q) = left_opened.value
    inl right_opened = !!!!LayoutIndex(right)
    inl ~(r, s) = right_opened.value
    if p =. 7i32 && !!!!EQ(q, "hi") && r =. 4i32 && !!!!EQ(s, "yo") then 0i32 else 1i32
