Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
406 additions
and
119 deletions.
There are no files selected for viewing
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
defmodule EventQueue.Handler do | ||
use GenEvent | ||
|
||
def init(event_queue) do | ||
{:ok, event_queue} | ||
end | ||
|
||
def handle_event(event, event_queue) do | ||
IO.inspect(event) | ||
GenServer.cast(event_queue, {:event, event}) | ||
{:ok, event_queue} | ||
end | ||
end | ||
|
||
defmodule EventQueue do | ||
@empty_queue :queue.new() | ||
|
||
use GenServer | ||
|
||
def start_link(event_manager) do | ||
{:ok, self} = GenServer.start_link(__MODULE__, :no_args) | ||
GenEvent.add_handler(event_manager, EventQueue.Handler, self) | ||
{:ok, self} | ||
end | ||
|
||
def init(:no_args) do | ||
{:ok, {@empty_queue, nil}} | ||
end | ||
|
||
def handle_cast({:event, event}, {queue, nil}) do | ||
{:noreply, {:queue.in(event, queue)}} | ||
end | ||
def handle_cast({:event, event}, {@empty_queue, from}) do | ||
GenServer.reply(from, event) | ||
{:noreply, {@empty_queue, nil}} | ||
end | ||
|
||
def handle_cast(:stop, _state) do | ||
{:stop, :normal, nil} | ||
end | ||
|
||
def handle_call(:next, from, {@empty_queue, nil}) do | ||
{:noreply, {@empty_queue, from}} | ||
end | ||
def handle_call(:next, _from, {queue, nil}) do | ||
{{:value, event}, queue} = :queue.out(queue) | ||
{:reply, event, queue} | ||
end | ||
|
||
def terminate(:normal, _state), do: :ok | ||
|
||
def terminate({:function_clause, _error}, _state), do: :ok | ||
end |
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,50 +1,89 @@ | ||
# defmodule Gald.Player do | ||
# use Supervisor | ||
|
||
# # Client | ||
# @spec start_link(String.t) :: Supervisor.on_start | ||
# def start_link(name) do | ||
# Supervisor.start_link(__MODULE__, name) | ||
# end | ||
|
||
# # Server | ||
# def init(_name) do | ||
# children = [] | ||
# supervise(children, strategy: :one_for_all) | ||
# end | ||
# end | ||
|
||
defmodule Gald.Player do | ||
defmodule Gald.Players do | ||
use GenServer | ||
|
||
# Client | ||
def start_link(name) do | ||
GenServer.start_link(__MODULE__, name) | ||
def start_link(race_out) do | ||
GenServer.start_link(__MODULE__, race_out) | ||
end | ||
|
||
def new_player(players, name) do | ||
GenServer.call(players, {:new_player, name}) | ||
end | ||
|
||
def names(players), do: GenServer.call(players, :names) | ||
def turn_order_deciding_data(players), do: GenServer.call(players, :turndata) | ||
|
||
# Server | ||
def init(name) do | ||
{:ok, name} | ||
def init(race_out) do | ||
{:ok, sup} = Supervisor.start_link([Supervisor.Spec.worker(Gald.Player, [])], strategy: :simple_one_for_one) | ||
dict = %{} | ||
join_ix = 0 | ||
{:ok, {sup, dict, race_out, join_ix}} | ||
end | ||
|
||
def handle_call({:new_player, name}, _from, {sup, dict, race_out, join_ix}) do | ||
if Map.has_key?(dict, name) do | ||
{:error, :duplicate_name} | ||
else | ||
{:ok, player} = Supervisor.start_child(sup, [name]) | ||
GenEvent.notify(race_out, {:new_player, name}) | ||
dict = Map.put(dict, name, %{pid: player, join_ix: join_ix}) | ||
join_ix = join_ix + 1 | ||
{:reply, {:ok, player}, {sup, dict, race_out, join_ix}} | ||
end | ||
end | ||
|
||
def handle_call(:names, _from, state = {_sup, dict, _race_out, _join_ix}) do | ||
names = dict | ||
|> Enum.sort_by(fn ({_k, %{join_ix: join_ix}}) -> join_ix end) | ||
|> Enum.map(fn ({k, _v}) -> k end) | ||
|> Enum.into([]) | ||
|
||
{:reply, names, state} | ||
end | ||
|
||
def handle_call(:turndata, _from, state = {_sup, dict, _race_out, _join_ix}) do | ||
res = dict | ||
|> Enum.map(fn ({k, %{join_ix: join_ix}}) -> {k, %{join_ix: join_ix}} end) | ||
|> Enum.into(%{}) | ||
|
||
{:reply, res, state} | ||
end | ||
end | ||
|
||
defmodule Gald.Player.Supervisor do | ||
use Supervisor | ||
defmodule Gald.Player do | ||
use GenServer | ||
|
||
# Client | ||
@spec start_link() :: Supervisor.on_start | ||
def start_link() do | ||
Supervisor.start_link(__MODULE__, []) | ||
def start_link(name) do | ||
GenServer.start_link(__MODULE__, name) | ||
end | ||
|
||
@spec add_player(pid, String.t) :: Supervisor.on_start | ||
def add_player(players, name) do | ||
Supervisor.start_child(players, [name]) | ||
def io(player) do | ||
player_in = GenServer.call(player, {:get, :in}) | ||
player_out = GenServer.call(player, {:get, :out}) | ||
{:ok, player_in, player_out} | ||
end | ||
|
||
def name(player), do: GenServer.call(player, {:get, :name}) | ||
|
||
# Server | ||
def init([]) do | ||
child = [supervisor(Gald.Player, [])] | ||
supervise(child, strategy: :simple_one_for_one) | ||
def init(name) do | ||
# TODO(Havvy): Make this an addressable supervision tree. | ||
{:ok, player_in} = GenServer.start_link(Gald.Player.In, []) | ||
{:ok, player_out} = GenEvent.start_link([]) | ||
{:ok, %{ | ||
name: name, | ||
in: player_in, | ||
out: player_out | ||
}} | ||
end | ||
|
||
def handle_call({:get, component}, _from, state) do | ||
{:reply, state[component], state} | ||
end | ||
end | ||
|
||
defmodule Gald.Player.In do | ||
use GenServer | ||
end |
This file contains 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
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
defmodule Gald.Rounds do | ||
use GenServer | ||
|
||
# Client | ||
def start_link(config) do | ||
GenServer.start_link(__MODULE__, config) | ||
end | ||
|
||
def begin(rounds), do: GenServer.cast(rounds, :begin) | ||
|
||
# Server | ||
def init(%{players: players, race_out: race_out, supervisor: sup}) do | ||
# TODO(Havvy): Should the order be passed to the Players actor? | ||
order = players | ||
|> Enum.sort_by(fn ({_k, %{join_ix: join_ix}}) -> join_ix end) | ||
|> Enum.map(fn ({k, _v}) -> k end) | ||
|> Enum.into([]) | ||
|
||
{:ok, %{ | ||
race_out: race_out, | ||
sup: sup, | ||
order: order, | ||
round: 1, | ||
round_order: order | ||
}} | ||
end | ||
|
||
def handle_cast(:begin, state = %{race_out: race_out}) do | ||
GenEvent.notify(race_out, {:round_start, 1}) | ||
|
||
{:noreply, state} | ||
end | ||
end |
Oops, something went wrong.