Created
March 21, 2017 12:11
-
-
Save Arkham/07a1cbaa3bdd8b4b191a69e4e329c973 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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