Elixir Error Reporting is pretty good huh?
As much as Elixir feels quite alien at times. The error reporting is really very thorough.
iex(4)> c = IslandsEngine.Coordinate.new(1,1)
{:ok, %IslandsEngine.Coordinate{col: 1, row: 1}}
iex(5)> Island.new(:square, c)
** (FunctionClauseError) no function clause matching in IslandsEngine.Island.new/2
The following arguments were given to IslandsEngine.Island.new/2:
# 1
:square
# 2
{:ok, %IslandsEngine.Coordinate{col: 1, row: 1}}
Attempted function clauses (showing 1 out of 1):
def new(type, %IslandsEngine.Coordinate{} = upper_left)
(islands_engine 0.1.0) lib/islands_engine/island.ex:7: IslandsEngine.Island.new/2
iex(5)> {:ok, c } = IslandsEngine.Coordinate.new(1,1)
{:ok, %IslandsEngine.Coordinate{col: 1, row: 1}}
iex(6)> c
%IslandsEngine.Coordinate{col: 1, row: 1}
iex(7)> Island.new(:square, c)
{:ok,
%IslandsEngine.Island{
coordinates: #MapSet<[
%IslandsEngine.Coordinate{col: 1, row: 1},
%IslandsEngine.Coordinate{col: 1, row: 2},
%IslandsEngine.Coordinate{col: 2, row: 1},
%IslandsEngine.Coordinate{col: 2, row: 2}
]>,
hit_coordinates: #MapSet<[]>
}}
I initially thought that an aliased %Coordinate{} could not be pattern matched against an %IslandEngine.Coordinate{}. Wrong. it can’t be pattern matched against a tuple. Wally.