Skip to content

Instantly share code, notes, and snippets.

@Arkham
Created March 21, 2017 12:11
Show Gist options
  • Save Arkham/07a1cbaa3bdd8b4b191a69e4e329c973 to your computer and use it in GitHub Desktop.
Save Arkham/07a1cbaa3bdd8b4b191a69e4e329c973 to your computer and use it in GitHub Desktop.
defmodule ProcessRing do
@moduledoc """
Documentation for ProcessRing.
"""
def start(name) do
spawn(ProcessRing, :init, [name])
end
def init(name) do
loop({name, :none})
end
defp loop({name, next}) do
current = self()
receive do
{:set_next, next} ->
loop({name, next})
{:message, message} ->
IO.puts("Node #{name}: MSG #{inspect(message)}")
send(next, {:forward, self(), message})
loop({name, next})
{:forward, ^current, message} ->
IO.puts("Node #{name}: MSG #{inspect(message)}. Stopped forwarding.")
loop({name, next})
{:forward, origin, message} ->
IO.puts("Node #{name}: MSG #{inspect(message)}. Forwarding..")
send(next, {:forward, origin, message})
loop({name, next})
:stop ->
Process.sleep(1)
send(next, :stop)
:ok
end
end
def test do
first = start("1")
second = start("2")
third = start("3")
send first, {:set_next, second}
send second, {:set_next, third}
send third, {:set_next, first}
send first, {:message, "FIRST"}
send second, {:message, "SECOND"}
send third, {:message, "THIRD"}
:ok
end
def test(num_nodes) when is_integer(num_nodes) and num_nodes > 1 do
first = start("1")
last = 2..num_nodes
|> Enum.reduce(first, fn(n, previous) ->
current = start(inspect(n))
send previous, {:set_next, current}
current
end)
send last, {:set_next, first}
send first, {:message, "HELLO"}
first
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment