Skip to content

Instantly share code, notes, and snippets.

@josevalim
Forked from pragdave/fib_with_agents.exs
Last active August 29, 2015 14:01
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save josevalim/dba28d63402d09cefb3a to your computer and use it in GitHub Desktop.
Save josevalim/dba28d63402d09cefb3a to your computer and use it in GitHub Desktop.
defmodule FibAgent do
def start_link do
cache = Enum.into([{0, 0}, {1, 1}], HashDict.new)
Agent.start_link(fn -> cache end)
end
def fib(pid, n) when n >= 0 do
Agent.get_and_update(pid, &do_fib(&1, n))
end
defp do_fib(cache, n) do
if cached = cache[n] do
{cached, cache}
else
{val1, cache} = do_fib(cache, n - 1)
{val2, cache} = do_fib(cache, n - 2)
{val1 + val2, Dict.put(cache, n, val1 + val2)}
end
end
end
{:ok, agent} = FibAgent.start_link()
IO.puts FibAgent.fib(agent, 20)
IO.puts FibAgent.fib(agent, 20)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment