Skip to content

Commit 03830e4

Browse files
author
Bernard Pietraga
committed
Add exercise 3 from chapter 15
1 parent 266a1fe commit 03830e4

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

chapter_15/nodes_3.ex

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
defmodule Ticker do
2+
@interval 2000
3+
@name :ticker
4+
5+
def start do
6+
pid = spawn(__MODULE__, :generator, [[]])
7+
:global.register_name(@name, pid)
8+
end
9+
10+
def register(client_pid) do
11+
send :global.whereis_name(@name), {:register, client_pid}
12+
end
13+
14+
def generator(clients) do
15+
receive do
16+
{:register, pid} ->
17+
IO.puts "registering: #{IO.inspect(pid)}"
18+
generator([pid | clients])
19+
after
20+
@interval ->
21+
case clients do
22+
[] ->
23+
generator(clients)
24+
25+
[client | rest_of_clients] ->
26+
IO.puts "tick to: #{IO.inspect(clients)}"
27+
send client, {:tick}
28+
generator(:lists.append(rest_of_clients, [client]))
29+
end
30+
end
31+
end
32+
end
33+
34+
defmodule Client do
35+
def start do
36+
pid = spawn(__MODULE__, :receiver, [])
37+
Ticker.register(pid)
38+
end
39+
40+
def receiver do
41+
receive do
42+
{:tick} ->
43+
IO.puts "tock in client"
44+
receiver()
45+
end
46+
end
47+
end

0 commit comments

Comments
 (0)