Current section
Files
Jump to
Current section
Files
src/atomic_array.erl
-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, []).