Packages

An implementation of the Perudo / Dudo / Pirate's Dice game written in Elixir.

Current section

Files

Jump to
perudox lib perudox game.ex
Raw

lib/perudox/game.ex

defmodule Perudox.Game do
@moduledoc """
The Perudo.Hand module represents the turn of a game.
"""
use GenServer
alias Perudox.{Game, Game.State}
alias Perudox.{Bet, Player}
# Public API.
@type t :: pid
@spec new :: Game.t
def new do
{:ok, game} = start_link()
game
end
@spec start_link() :: {:ok, Game.t}
def start_link do
GenServer.start_link __MODULE__, %State{}
end
@spec join(Game.t, Player.t) :: {:ok, Player.t}
def join(game, player) do
GenServer.call game, {:join, player}
end
@spec start(Game.t) :: :ok
def start(game) do
GenServer.call game, :start
end
@spec bet(Game.t, Player.t, Bet.t) :: {:ok, State.t} | {:error, atom}
def bet(game, player, bet) do
GenServer.call game, {:bet, player, bet}
end
@spec dudo(Game.t, Player.t) :: {:ok, State.t} | {:error, atom}
def dudo(game, player) do
GenServer.call game, {:dudo, player}
end
# GenServer callbacks.
@spec init(State.t) :: {:ok, State.t}
def init(state) do
{:ok, state}
end
def handle_call({:join, player}, _from, state) do
case State.add_player state, player do
%State{} = state -> {:reply, :ok, state}
{:error, _} = e -> {:reply, e, state}
end
end
def handle_call(:start, _from, state) do
case State.start state do
%State{} = state -> {:reply, :ok, state}
{:error, _} = e -> {:reply, e, state}
end
end
def handle_call({:bet, player, bet}, _from, state) do
case State.bet state, player, bet do
%State{} = state -> {:reply, :ok, state}
{:error, _} = e -> {:reply, e, state}
end
end
def handle_call({:dudo, player}, _from, state) do
case State.dudo state, player do
%State{} = state -> {:reply, :ok, state}
{:error, _} = e -> {:reply, e, state}
end
end
end