defmodule CPSolver.Utils.MutableArray do def swap(array, index1, index2) do val1 = array_get(array, index1) val2 = array_get(array, index2) array_update(array, index1, val2) array_update(array, index2, val1) end def new(arity) when is_integer(arity) do :atomics.new(arity, signed: true) end def new(list) when is_list(list) do ref = new(length(list)) Enum.reduce(list, 1, fn el, idx -> :atomics.put(ref, idx, el) idx + 1 end) ref end def array_size(ref) do :atomics.info(ref).size end def array_update(ref, zb_index, value) when is_reference(ref) and zb_index >= 0 and is_integer(value) do :atomics.put(ref, zb_index + 1, value) end def array_add(ref, zb_index, value) when is_reference(ref) and zb_index >= 0 and is_integer(value) do :atomics.add(ref, zb_index + 1, value) end def array_get(ref, zb_index) when is_reference(ref) and zb_index >= 0 do :atomics.get(ref, zb_index + 1) end def to_array(ref, fun \\ fn _i, val -> val end) do for i <- 1..:atomics.info(ref).size do fun.(i, :atomics.get(ref, i)) end end end