271 lines
8.6 KiB
Plaintext
271 lines
8.6 KiB
Plaintext
(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))
|
|
|
|
(fn empty () -> (vec i32)
|
|
(std.vec.i32.empty))
|
|
|
|
(fn append ((values (vec i32)) (value i32)) -> (vec i32)
|
|
(std.vec.i32.append values value))
|
|
|
|
(fn len ((values (vec i32))) -> i32
|
|
(std.vec.i32.len values))
|
|
|
|
(fn at ((values (vec i32)) (position i32)) -> i32
|
|
(std.vec.i32.index values position))
|
|
|
|
(fn singleton ((value i32)) -> (vec i32)
|
|
(append (empty) value))
|
|
|
|
(fn append2 ((values (vec i32)) (first i32) (second i32)) -> (vec i32)
|
|
(append (append values first) second))
|
|
|
|
(fn append3 ((values (vec i32)) (first i32) (second i32) (third i32)) -> (vec i32)
|
|
(append (append2 values first second) third))
|
|
|
|
(fn pair ((first i32) (second i32)) -> (vec i32)
|
|
(append2 (empty) first second))
|
|
|
|
(fn triple ((first i32) (second i32) (third i32)) -> (vec i32)
|
|
(append3 (empty) first second third))
|
|
|
|
(fn repeat_loop ((value i32) (remaining i32) (result (vec i32))) -> (vec i32)
|
|
(if (< remaining 1)
|
|
result
|
|
(repeat_loop value (- remaining 1) (append result value))))
|
|
|
|
(fn repeat ((value i32) (count i32)) -> (vec i32)
|
|
(if (< count 1)
|
|
(empty)
|
|
(repeat_loop value count (empty))))
|
|
|
|
(fn range_from_zero_loop ((current i32) (count i32) (result (vec i32))) -> (vec i32)
|
|
(if (< current count)
|
|
(range_from_zero_loop (+ current 1) count (append result current))
|
|
result))
|
|
|
|
(fn range_loop ((current i32) (end_exclusive i32) (result (vec i32))) -> (vec i32)
|
|
(if (< current end_exclusive)
|
|
(range_loop (+ current 1) end_exclusive (append result current))
|
|
result))
|
|
|
|
(fn range ((start i32) (end_exclusive i32)) -> (vec i32)
|
|
(if (< start end_exclusive)
|
|
(range_loop start end_exclusive (empty))
|
|
(empty)))
|
|
|
|
(fn range_from_zero ((count i32)) -> (vec i32)
|
|
(if (< count 1)
|
|
(empty)
|
|
(range_from_zero_loop 0 count (empty))))
|
|
|
|
(fn is_empty ((values (vec i32))) -> bool
|
|
(= (len values) 0))
|
|
|
|
(fn index_or ((values (vec i32)) (position i32) (fallback i32)) -> i32
|
|
(if (< position 0)
|
|
fallback
|
|
(if (< position (len values))
|
|
(at values position)
|
|
fallback)))
|
|
|
|
(fn first_or ((values (vec i32)) (fallback i32)) -> i32
|
|
(index_or values 0 fallback))
|
|
|
|
(fn last_or ((values (vec i32)) (fallback i32)) -> i32
|
|
(if (is_empty values)
|
|
fallback
|
|
(at values (- (len values) 1))))
|
|
|
|
(fn index_option ((values (vec i32)) (position i32)) -> (option i32)
|
|
(if (< position 0)
|
|
(none_i32)
|
|
(if (< position (len values))
|
|
(some_i32 (at values position))
|
|
(none_i32))))
|
|
|
|
(fn first_option ((values (vec i32))) -> (option i32)
|
|
(index_option values 0))
|
|
|
|
(fn last_option ((values (vec i32))) -> (option i32)
|
|
(if (is_empty values)
|
|
(none_i32)
|
|
(some_i32 (at values (- (len values) 1)))))
|
|
|
|
(fn index_of_option ((values (vec i32)) (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 (vec i32)) (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 (vec i32)) (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 (vec i32)) (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 (vec i32))) -> 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 (vec i32)) (right (vec i32)) (position i32) (right_len i32)) -> (vec i32)
|
|
(if (< position right_len)
|
|
(concat_loop (append result (at right position)) right (+ position 1) right_len)
|
|
result))
|
|
|
|
(fn concat ((left (vec i32)) (right (vec i32))) -> (vec i32)
|
|
(let right_len i32 (len right))
|
|
(concat_loop left right 0 right_len))
|
|
|
|
(fn take_loop ((values (vec i32)) (position i32) (limit i32) (result (vec i32))) -> (vec i32)
|
|
(if (< position limit)
|
|
(take_loop values (+ position 1) limit (append result (at values position)))
|
|
result))
|
|
|
|
(fn take ((values (vec i32)) (count i32)) -> (vec i32)
|
|
(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 (vec i32)) (prefix (vec i32))) -> bool
|
|
(let prefix_len i32 (len prefix))
|
|
(if (< (len values) prefix_len)
|
|
false
|
|
(= (take values prefix_len) prefix)))
|
|
|
|
(fn without_prefix ((values (vec i32)) (prefix (vec i32))) -> (vec i32)
|
|
(if (starts_with values prefix)
|
|
(drop values (len prefix))
|
|
values))
|
|
|
|
(fn ends_with ((values (vec i32)) (suffix (vec i32))) -> 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 (vec i32)) (suffix (vec i32))) -> (vec i32)
|
|
(if (ends_with values suffix)
|
|
(take values (- (len values) (len suffix)))
|
|
values))
|
|
|
|
(fn drop_loop ((values (vec i32)) (position i32) (values_len i32) (result (vec i32))) -> (vec i32)
|
|
(if (< position values_len)
|
|
(drop_loop values (+ position 1) values_len (append result (at values position)))
|
|
result))
|
|
|
|
(fn drop ((values (vec i32)) (count i32)) -> (vec i32)
|
|
(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 (vec i32)) (position i32) (result (vec i32))) -> (vec i32)
|
|
(if (< position 0)
|
|
result
|
|
(reverse_loop values (- position 1) (append result (at values position)))))
|
|
|
|
(fn reverse ((values (vec i32))) -> (vec i32)
|
|
(reverse_loop values (- (len values) 1) (empty)))
|
|
|
|
(fn subvec ((values (vec i32)) (start i32) (end_exclusive i32)) -> (vec i32)
|
|
(if (< start 0)
|
|
(empty)
|
|
(if (< start end_exclusive)
|
|
(take (drop values start) (- end_exclusive start))
|
|
(empty))))
|
|
|
|
(fn insert_at ((values (vec i32)) (position i32) (value i32)) -> (vec i32)
|
|
(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 (vec i32)) (position i32) (inserted (vec i32))) -> (vec i32)
|
|
(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 (vec i32)) (position i32) (replacement i32)) -> (vec i32)
|
|
(if (< position 0)
|
|
values
|
|
(if (< position (len values))
|
|
(concat (append (take values position) replacement) (drop values (+ position 1)))
|
|
values)))
|
|
|
|
(fn replace_range ((values (vec i32)) (start i32) (end_exclusive i32) (replacement (vec i32))) -> (vec i32)
|
|
(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 (vec i32)) (position i32)) -> (vec i32)
|
|
(if (< position 0)
|
|
values
|
|
(if (< position (len values))
|
|
(concat (take values position) (drop values (+ position 1)))
|
|
values)))
|
|
|
|
(fn remove_range ((values (vec i32)) (start i32) (end_exclusive i32)) -> (vec i32)
|
|
(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)))
|