Packages

AgentMap can be seen as a stateful Map that parallelize operations made on different keys. Basically, it can be used as a cache, memoization, computational framework and, sometimes, as an alternative to GenServer.

Current section

Files

Jump to
agent_map lib agent_map enumerable.ex
Raw

lib/agent_map/enumerable.ex

defimpl Enumerable, for: AgentMap do
import AgentMap
def count(%AgentMap{link: mag}) do
{:ok, GenServer.call(mag, :count)}
end
def member?(mag, {key, value}) do
case fetch(mag, key) do
{:ok, ^value} -> {:ok, true}
_ -> {:ok, false}
end
end
def slice(mag) do
map = take(mag, keys(mag))
{:ok, map_size(map), &Enumerable.List.slice(:maps.to_list(map), &1, &2)}
end
def reduce(mag, acc, fun) do
map = take(mag, keys(mag))
reduce_list(:maps.to_list(map), acc, fun)
end
defp reduce_list(_, {:halt, acc}, _fun), do: {:halted, acc}
defp reduce_list([], {:cont, acc}, _fun), do: {:done, acc}
defp reduce_list([h | t], {:cont, acc}, fun) do
reduce_list(t, fun.(h, acc), fun)
end
defp reduce_list(list, {:suspend, acc}, fun) do
{:suspended, acc, &reduce_list(list, &1, fun)}
end
end