-module(iarray). -export([new/1, % new imperative array of given size get/2, % element at given index set/3 % set element at given index ]). -export([element/1]). % internal element(Val) -> receive {get, Pid} -> Pid ! {self(), Val}, element(Val); {set, Val1} -> element(Val1) end. eget(E) -> E ! {get, self()}, receive {E, none} -> not_initialized; {E, Val} -> Val end. eset(Val, E) -> E ! {set, Val}, ok. elements(N) -> elements(N, []). elements(0, Buffer) -> Buffer; elements(N, Buffer) when N > 0 -> elements(N-1, [spawn(iarray, element, [none]) | Buffer]). new(N) -> array:from_list(elements(N)). get(Index, A) -> eget(array:get(Index, A)). set(Index, Val, A) -> eset(Val, array:get(Index, A)).