lib/piece.ex

defmodule Tabletop.Piece do
  @moduledoc """
  This module provides the struct for representing pieces on the board
  as well as functions to manipulate them.

  ## The Tabletop.Piece Struct

  The public fields are:

    * `id`         - An identifier used for display or querying
    * `attributes` - A map of attributes held by the piece

  """

  @enforce_keys [:id]
  defstruct [:id, attributes: %{}]

  @doc """
  Assigns the provided `attributes` to the `piece`. Any existing attributes that
  share a key will be overridden.
  """
  def assign(piece, attributes) do
    %Tabletop.Piece{piece | attributes: Enum.into(attributes, piece.attributes)}
  end

  @doc """
  Creates a new piece with the given `id`.
  """
  def new(id) do
    %Tabletop.Piece{id: id}
  end

  @doc """
  Checks if two pieces are the same by comparing ids.
  """
  def equal?(%Tabletop.Piece{id: a}, %Tabletop.Piece{id: b}) do
    a == b
  end

  def equal?(_, _) do
    false
  end
end