-module(array). -export([new/0, store/3, retrieve/2, keys/1, delete/1]). new() -> spawn(fun () -> loop([]) end). store(Array, Key, Val) -> Array ! {store, Key, Val}, Val. retrieve(Array, Key) -> Array ! {retrieve, self(), Key}, receive {did_retrieve, Array, Val} -> Val end. keys(Array) -> Array ! {keys, self()}, receive {did_keys, Array, Keys} -> Keys end. delete(Array) -> Array ! {delete}, ok. loop(Assocs) -> receive {store, Key, Val} -> loop(do_store(Assocs, Key, Val)); {retrieve, Whom, Key} -> Whom ! {did_retrieve, self(), do_retrieve(Assocs, Key)}, loop(Assocs); {keys, Whom} -> Whom ! {did_keys, self(), do_keys(Assocs)}, loop(Assocs); {delete} -> ok end. do_store([], Key, New) -> [{Key,New}]; do_store([{Key,_}|Rest], Key, New) -> [{Key,New}|Rest]; do_store([Pair|Rest], Key, New) -> [Pair|do_store(Rest, Key, New)]. do_retrieve([], _) -> nothing; do_retrieve([{Key,Val}|_], Key) -> {just, Val}; do_retrieve([_|Rest], Key) -> do_retrieve(Rest, Key). do_keys(Assocs) -> lists:map(fun({Key,_}) -> Key end, Assocs).