program main
  fn empty_values() -> (vec i32)
    call std.vec.i32.empty : (vec i32)
  fn pair(base: i32) -> (vec i32)
    local let values : unit
      call std.vec.i32.empty : (vec i32)
    local let first : unit
      call std.vec.i32.append : (vec i32)
        var values : (vec i32)
        var base : i32
    call std.vec.i32.append : (vec i32)
      var first : (vec i32)
      binary + : i32
        var base : i32
        int 1 : i32
  fn echo(values: (vec i32)) -> (vec i32)
    var values : (vec i32)
  fn length(values: (vec i32)) -> i32
    call std.vec.i32.len : i32
      var values : (vec i32)
  fn at(values: (vec i32), i: i32) -> i32
    call std.vec.i32.index : i32
      var values : (vec i32)
      var i : i32
  fn call_return_len() -> i32
    call std.vec.i32.len : i32
      call echo : (vec i32)
        call pair : (vec i32)
          int 20 : i32
  fn original_len_after_append() -> i32
    local let values : unit
      call std.vec.i32.empty : (vec i32)
    local let appended : unit
      call std.vec.i32.append : (vec i32)
        var values : (vec i32)
        int 1 : i32
    call std.vec.i32.len : i32
      var values : (vec i32)
  fn main() -> i32
    call std.io.print_i32 : unit
      call call_return_len : i32
    call at : i32
      call pair : (vec i32)
        int 40 : i32
      int 1 : i32
  test "vec i32 empty length"
    binary = : bool
      call std.vec.i32.len : i32
        call empty_values : (vec i32)
      int 0 : i32
  test "vec i32 append length"
    binary = : bool
      call length : i32
        call pair : (vec i32)
          int 40 : i32
      int 2 : i32
  test "vec i32 index"
    binary = : bool
      call at : i32
        call pair : (vec i32)
          int 40 : i32
        int 1 : i32
      int 41 : i32
  test "vec i32 append is immutable"
    binary = : bool
      call original_len_after_append : i32
      int 0 : i32
  test "vec i32 equality"
    binary = : bool
      call pair : (vec i32)
        int 5 : i32
      call std.vec.i32.append : (vec i32)
        call std.vec.i32.append : (vec i32)
          call std.vec.i32.empty : (vec i32)
          int 5 : i32
        int 6 : i32
