type t = { mutable data : int array; mutable length : int; mutable capacity : int; } let length a = a.length let create () = { data = Array.create 512 0; length = 0; capacity = 512 } let resize a = let ncap = a.capacity lsl 1 in let b = Array.create ncap 0 in for i = 0 to a.capacity - 1 do b.(i) <- a.data.(i) done; a.data <- b; a.capacity <- ncap let get a i = if i >= 0 && i < a.length then a.data.(i) else failwith "Invalid array access" let set a i v = if i >= 0 && i < a.length then a.data.(i) <- v else failwith "Invalid array access" let unsafe_get a i = a.data.(i) let unsafe_set a i v = a.data.(i) <- v let push_back a v = if a.length >= a.capacity then resize a; a.data.(a.length) <- v; a.length <- a.length + 1 let pack a = let b = Array.create a.length 0 in Array.blit a.data 0 b 0 a.length; b