-module(atomic_array). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([get/2, add/3, exchange/3, compare_exchange/4, size/1, set/3, new_signed/1, new_unsigned/1, to_list/1]). -export_type([atomic_array/0, compare_error/0]). -type atomic_array() :: any(). -type compare_error() :: comparison_out_of_bounds | {comparison_failed, integer()}. -spec get(atomic_array(), integer()) -> {ok, integer()} | {error, nil}. get(Array, Index) -> atomic_array_ffi:get(Array, Index). -spec add(atomic_array(), integer(), integer()) -> {ok, nil} | {error, nil}. add(Array, Index, Amount) -> atomic_array_ffi:add(Array, Index, Amount). -spec exchange(atomic_array(), integer(), integer()) -> {ok, integer()} | {error, nil}. exchange(Array, Index, Value) -> atomic_array_ffi:exchange(Array, Index, Value). -spec compare_exchange(atomic_array(), integer(), integer(), integer()) -> {ok, nil} | {error, compare_error()}. compare_exchange(Array, Index, Expected, Value) -> atomic_array_ffi:compare_exchange(Array, Index, Expected, Value). -spec size(atomic_array()) -> integer(). size(Array) -> atomic_array_ffi:size(Array). -spec set(atomic_array(), integer(), integer()) -> {ok, nil} | {error, nil}. set(Array, Index, Value) -> atomic_array_ffi:set(Array, Index, Value). -spec new_signed(integer()) -> atomic_array(). new_signed(Size) -> atomic_array_ffi:new_signed(gleam@int:max(Size, 1)). -spec new_unsigned(integer()) -> atomic_array(). new_unsigned(Size) -> atomic_array_ffi:new_unsigned(gleam@int:max(Size, 1)). -spec array_to_list(atomic_array(), integer(), list(integer())) -> list(integer()). array_to_list(Array, Index, Accumulator) -> case Index of -1 -> Accumulator; _ -> Element = atomic_array_ffi:get_or_panic(Array, Index), array_to_list(Array, Index - 1, [Element | Accumulator]) end. -spec to_list(atomic_array()) -> list(integer()). to_list(Array) -> array_to_list(Array, atomic_array_ffi:size(Array) - 1, []).