31 lines
722 B
Elixir
31 lines
722 B
Elixir
defmodule ZombieSurvivor.Game do
|
|
alias ZombieSurvivor.{Game, Survivor}
|
|
|
|
@type t :: %__MODULE__{survivors: %{String.t() => Survivor.t()}}
|
|
|
|
defstruct survivors: %{}
|
|
|
|
@spec new() :: Game.t()
|
|
def new(), do: %Game{}
|
|
|
|
@spec add_survivor(Game.t(), Survivor.t()) :: Game.t()
|
|
def add_survivor(game, survivor) do
|
|
name = survivor.name
|
|
|
|
if Map.has_key?(game, name) do
|
|
game
|
|
else
|
|
%{game | survivors: Map.put(game.survivors, name, survivor)}
|
|
end
|
|
end
|
|
|
|
@spec ended?(Game.t()) :: boolean
|
|
def ended?(%Game{survivors: survivors}) when map_size(survivors) == 0, do: false
|
|
|
|
def ended?(game) do
|
|
Enum.all?(game.survivors, fn {_, survivor} ->
|
|
Survivor.dead?(survivor)
|
|
end)
|
|
end
|
|
end
|