(module vec_i32 (export empty append len at singleton append2 append3 pair triple repeat range range_from_zero is_empty index_or first_or last_or index_option first_option last_option index_of_option last_index_of_option count_of contains sum concat take starts_with without_prefix ends_with without_suffix drop reverse subvec insert_at insert_range replace_at replace_range remove_at remove_range)) (import std.option (some_i32 none_i32)) (type VecI32 (vec i32)) (fn empty () -> VecI32 (std.vec.i32.empty)) (fn append ((values VecI32) (value i32)) -> VecI32 (std.vec.i32.append values value)) (fn len ((values VecI32)) -> i32 (std.vec.i32.len values)) (fn at ((values VecI32) (position i32)) -> i32 (std.vec.i32.index values position)) (fn singleton ((value i32)) -> VecI32 (append (empty) value)) (fn append2 ((values VecI32) (first i32) (second i32)) -> VecI32 (append (append values first) second)) (fn append3 ((values VecI32) (first i32) (second i32) (third i32)) -> VecI32 (append (append2 values first second) third)) (fn pair ((first i32) (second i32)) -> VecI32 (append2 (empty) first second)) (fn triple ((first i32) (second i32) (third i32)) -> VecI32 (append3 (empty) first second third)) (fn repeat_loop ((value i32) (remaining i32) (result VecI32)) -> VecI32 (if (< remaining 1) result (repeat_loop value (- remaining 1) (append result value)))) (fn repeat ((value i32) (count i32)) -> VecI32 (if (< count 1) (empty) (repeat_loop value count (empty)))) (fn range_from_zero_loop ((current i32) (count i32) (result VecI32)) -> VecI32 (if (< current count) (range_from_zero_loop (+ current 1) count (append result current)) result)) (fn range_loop ((current i32) (end_exclusive i32) (result VecI32)) -> VecI32 (if (< current end_exclusive) (range_loop (+ current 1) end_exclusive (append result current)) result)) (fn range ((start i32) (end_exclusive i32)) -> VecI32 (if (< start end_exclusive) (range_loop start end_exclusive (empty)) (empty))) (fn range_from_zero ((count i32)) -> VecI32 (if (< count 1) (empty) (range_from_zero_loop 0 count (empty)))) (fn is_empty ((values VecI32)) -> bool (= (len values) 0)) (fn index_or ((values VecI32) (position i32) (fallback i32)) -> i32 (if (< position 0) fallback (if (< position (len values)) (at values position) fallback))) (fn first_or ((values VecI32) (fallback i32)) -> i32 (index_or values 0 fallback)) (fn last_or ((values VecI32) (fallback i32)) -> i32 (if (is_empty values) fallback (at values (- (len values) 1)))) (fn index_option ((values VecI32) (position i32)) -> (option i32) (if (< position 0) (none_i32) (if (< position (len values)) (some_i32 (at values position)) (none_i32)))) (fn first_option ((values VecI32)) -> (option i32) (index_option values 0)) (fn last_option ((values VecI32)) -> (option i32) (if (is_empty values) (none_i32) (some_i32 (at values (- (len values) 1))))) (fn index_of_option ((values VecI32) (target i32)) -> (option i32) (var position i32 0) (var found_position i32 -1) (while (and (< position (len values)) (< found_position 0)) (set found_position (if (= (at values position) target) position found_position)) (set position (+ position 1))) (if (< found_position 0) (none_i32) (some_i32 found_position))) (fn last_index_of_option ((values VecI32) (target i32)) -> (option i32) (var position i32 0) (var found_position i32 -1) (while (< position (len values)) (set found_position (if (= (at values position) target) position found_position)) (set position (+ position 1))) (if (< found_position 0) (none_i32) (some_i32 found_position))) (fn count_of ((values VecI32) (target i32)) -> i32 (var position i32 0) (var hits i32 0) (while (< position (len values)) (set hits (+ hits (if (= (at values position) target) 1 0))) (set position (+ position 1))) hits) (fn contains ((values VecI32) (target i32)) -> bool (var position i32 0) (var hits i32 0) (while (< position (len values)) (set hits (+ hits (if (= (at values position) target) 1 0))) (set position (+ position 1))) (> hits 0)) (fn sum ((values VecI32)) -> i32 (var position i32 0) (var total i32 0) (while (< position (len values)) (set total (+ total (at values position))) (set position (+ position 1))) total) (fn concat_loop ((result VecI32) (right VecI32) (position i32) (right_len i32)) -> VecI32 (if (< position right_len) (concat_loop (append result (at right position)) right (+ position 1) right_len) result)) (fn concat ((left VecI32) (right VecI32)) -> VecI32 (let right_len i32 (len right)) (concat_loop left right 0 right_len)) (fn take_loop ((values VecI32) (position i32) (limit i32) (result VecI32)) -> VecI32 (if (< position limit) (take_loop values (+ position 1) limit (append result (at values position))) result)) (fn take ((values VecI32) (count i32)) -> VecI32 (let values_len i32 (len values)) (if (< count 0) (empty) (if (< count values_len) (take_loop values 0 count (empty)) values))) (fn starts_with ((values VecI32) (prefix VecI32)) -> bool (let prefix_len i32 (len prefix)) (if (< (len values) prefix_len) false (= (take values prefix_len) prefix))) (fn without_prefix ((values VecI32) (prefix VecI32)) -> VecI32 (if (starts_with values prefix) (drop values (len prefix)) values)) (fn ends_with ((values VecI32) (suffix VecI32)) -> bool (let values_len i32 (len values)) (let suffix_len i32 (len suffix)) (if (< values_len suffix_len) false (= (drop values (- values_len suffix_len)) suffix))) (fn without_suffix ((values VecI32) (suffix VecI32)) -> VecI32 (if (ends_with values suffix) (take values (- (len values) (len suffix))) values)) (fn drop_loop ((values VecI32) (position i32) (values_len i32) (result VecI32)) -> VecI32 (if (< position values_len) (drop_loop values (+ position 1) values_len (append result (at values position))) result)) (fn drop ((values VecI32) (count i32)) -> VecI32 (let values_len i32 (len values)) (if (< count 0) values (if (< count values_len) (drop_loop values count values_len (empty)) (empty)))) (fn reverse_loop ((values VecI32) (position i32) (result VecI32)) -> VecI32 (if (< position 0) result (reverse_loop values (- position 1) (append result (at values position))))) (fn reverse ((values VecI32)) -> VecI32 (reverse_loop values (- (len values) 1) (empty))) (fn subvec ((values VecI32) (start i32) (end_exclusive i32)) -> VecI32 (if (< start 0) (empty) (if (< start end_exclusive) (take (drop values start) (- end_exclusive start)) (empty)))) (fn insert_at ((values VecI32) (position i32) (value i32)) -> VecI32 (if (< position 0) values (if (< position (len values)) (concat (append (take values position) value) (drop values position)) (if (= position (len values)) (append values value) values)))) (fn insert_range ((values VecI32) (position i32) (inserted VecI32)) -> VecI32 (if (< position 0) values (if (< position (len values)) (concat (concat (take values position) inserted) (drop values position)) (if (= position (len values)) (concat values inserted) values)))) (fn replace_at ((values VecI32) (position i32) (replacement i32)) -> VecI32 (if (< position 0) values (if (< position (len values)) (concat (append (take values position) replacement) (drop values (+ position 1))) values))) (fn replace_range ((values VecI32) (start i32) (end_exclusive i32) (replacement VecI32)) -> VecI32 (let values_len i32 (len values)) (if (< start 0) values (if (< start values_len) (if (< start end_exclusive) (concat (concat (take values start) replacement) (drop values end_exclusive)) values) values))) (fn remove_at ((values VecI32) (position i32)) -> VecI32 (if (< position 0) values (if (< position (len values)) (concat (take values position) (drop values (+ position 1))) values))) (fn remove_range ((values VecI32) (start i32) (end_exclusive i32)) -> VecI32 (let values_len i32 (len values)) (if (< start 0) values (if (< start values_len) (if (< start end_exclusive) (concat (take values start) (drop values end_exclusive)) values) values)))