; Benchmark scaffold fixture for local-machine vec-i32-index timing comparisons only.
; Keep LOOP_COUNT and EXPECTED_CHECKSUM aligned with the C/Rust/Python fixtures.
; The runner supplies the loop count through stdin or argv so native compilers
; cannot fold the benchmark loop into a constant answer.

(module main)

(import std.vec_i32 (empty append2 append3 at))

(fn loop_count () -> i32
  1000000)

(fn expected_checksum () -> i32
  3875007)

(fn parse_stdin_loop_count () -> (result i32 i32)
  (let input (result string i32) (std.io.read_stdin_result))
  (match input
    ((ok text)
      (std.string.parse_i32_result text))
    ((err code)
      (err i32 i32 code))))

(fn parse_arg_loop_count () -> (result i32 i32)
  (std.string.parse_i32_result (std.process.arg 1)))

(fn configured_stdin_loop_count () -> i32
  (let parsed_stdin (result i32 i32) (parse_stdin_loop_count))
  (if (is_ok parsed_stdin)
    (unwrap_ok parsed_stdin)
    (loop_count)))

(fn configured_loop_count () -> i32
  (let parsed_arg (result i32 i32) (parse_arg_loop_count))
  (if (is_ok parsed_arg)
    (unwrap_ok parsed_arg)
    (configured_stdin_loop_count)))

(fn values () -> (vec i32)
  (append2 (append3 (append3 (empty) 3 1 4) 1 5 9) 2 6))

(fn vec_i32_index_loop ((limit i32)) -> i32
  (let digits (vec i32) (values))
  (var i i32 0)
  (var acc i32 7)
  (while (< i limit)
    (set acc (+ acc (at digits (% i 8))))
    (set acc (if (> acc 1000000000)
      (- acc 1000000000)
      acc))
    (set i (+ i 1)))
  acc)

(fn main () -> i32
  (let result i32 (vec_i32_index_loop (configured_loop_count)))
  (std.io.print_i32 result)
  (if (= result (expected_checksum))
    0
    1))

(test "vec i32 index loop checksum is deterministic"
  (= (vec_i32_index_loop (loop_count)) (expected_checksum)))
