View Source Hold.CoordinateGrid (hold v0.1.0)
A collection of values held at Hold.Coordinate
s.
Summary
Types
Representation of item at a Hold.Coordinate.t/0
in t/0
.
User provided value being stored at t:Hold.Corrdinate.t/0
in grid.
Functions
Add value
to grid
at coord
.
Get value to downward from coord
in grid
.
Returns whether grid
contains a coord to the downward from coord
.
Get value of grid
at coord
returning nil in the case of an empty
t:cell
.
Get value to left of coord
in grid
.
Returns whether grid
contains a coord to the immediate left of coord
.
Return whether t:coord
contains a t:cell
in grid
.
Return list of immediate neighboring coordinates to coord
members of grid
.
Check if coord
has any neighbors who are members of grid
.
Creates a new CoordinateGrid
.
Returns whether grid
contains a coord to the right from coord
.
Returns whether grid
contains a coord to the right of coord
.
Traverse over grid starting at coord
collecting an accumulator value.
Get cell upward of coord
in grid
.
Returns whether grid
contains a coord to the upward from coord
.
Types
@type cell() :: nil | {Hold.Coordinate.t(), value()}
A representation of a valid t:Hold.Coordinate.t/
in grid
and value/0
it is
holding.
@opaque member()
@opaque member(a)
Representation of item at a Hold.Coordinate.t/0
in t/0
.
@opaque predicate()
@type t() :: %Hold.CoordinateGrid{g: %{required(Hold.Coordinate.t()) => member()}}
@type t(a) :: %Hold.CoordinateGrid{g: %{required(Hold.Coordinate.t()) => member(a)}}
@type value() :: term()
User provided value being stored at t:Hold.Corrdinate.t/0
in grid.
Functions
@spec add(t(), Hold.Coordinate.t(), value()) :: t()
Add value
to grid
at coord
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> Hold.CoordinateGrid.get(grid, {1, 1})
{{1, 1}, :mine}
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> Hold.CoordinateGrid.get(grid, {10, 10})
nil
@spec down(t(), Hold.Coordinate.t()) :: nil | value()
Get value to downward from coord
in grid
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :powerup)
iex> Hold.CoordinateGrid.down(grid, {1, 1})
{{2, 1}, :powerup}
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :powerup)
iex> Hold.CoordinateGrid.right(grid, {2, 1})
nil
@spec down?(t(), Hold.Coordinate.t(), predicate()) :: boolean()
Returns whether grid
contains a coord to the downward from coord
.
An optional predicate function can be passed as an additional test on found value.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :powerup)
iex> Hold.CoordinateGrid.down?(grid, {1, 1})
true
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :powerup)
iex> Hold.CoordinateGrid.down?(grid, {2, 1})
false
An optional predicate can be passed to further test found t:cell
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :powerup)
iex> Hold.CoordinateGrid.down?(grid, {1, 1}, fn {_coord, value} -> value == :powerup end)
true
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :powerup)
iex> Hold.CoordinateGrid.down?(grid, {1, 1}, fn {_coord, value} -> value == :mine end)
false
@spec get(t(), Hold.Coordinate.t()) :: cell()
Get value of grid
at coord
returning nil in the case of an empty
t:cell
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> Hold.CoordinateGrid.get(grid, {1, 1})
{{1, 1}, :mine}
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> Hold.CoordinateGrid.get(grid, {10, 10})
nil
@spec left(t(), Hold.Coordinate.t()) :: cell()
Get value to left of coord
in grid
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.left(grid, {1, 2})
{{1, 1}, :mine}
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.left(grid, {1, 1})
nil
@spec left?(t(), Hold.Coordinate.t(), predicate()) :: boolean()
Returns whether grid
contains a coord to the immediate left of coord
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.left?(grid, {1, 2})
true
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.left?(grid, {1, 1})
false
An optional predicate can be passed to further test found t:cell
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.left?(grid, {1, 2}, fn {_coord, value} -> value == :mine end)
true
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.left?(grid, {1, 2}, fn {_coord, value} -> value != :mine end)
false
@spec member?(t(), Hold.Coordinate.t(), predicate()) :: boolean()
Return whether t:coord
contains a t:cell
in grid
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> Hold.CoordinateGrid.member?(grid, {1, 1})
true
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> Hold.CoordinateGrid.member?(grid, {10, 10})
false
An optional predicate can be passed to further test found t:cell
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> Hold.CoordinateGrid.member?(grid, {1, 1}, fn {_coord, value} -> value != :mine end)
false
@spec neighbors(t(), Hold.Coordinate.t(), predicate()) :: [cell()]
Return list of immediate neighboring coordinates to coord
members of grid
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.neighbors(grid, {1, 1})
[{{2, 1}, :mine}, {{1, 2}, :powerup}]
An optional predicate function can be passed as an additional test on found neighbors.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.neighbors(grid, {1, 1}, fn {_coord, value} -> value == :mine end)
[{{2, 1}, :mine}]
@spec neighbors?(t(), Hold.Coordinate.t(), predicate()) :: boolean()
Check if coord
has any neighbors who are members of grid
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.neighbors?(grid, {1, 1})
true
An optional predicate function can be passed as an additional test on neighbors.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.neighbors?(grid, {1, 1}, fn {_coord, value} -> value == :mine end)
false
@spec new() :: t()
Creates a new CoordinateGrid
.
iex> Hold.CoordinateGrid.new()
%Hold.CoordinateGrid{g: %{}}
@spec right(t(), Hold.Coordinate.t()) :: cell()
Returns whether grid
contains a coord to the right from coord
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.right(grid, {1, 1})
{{1, 2}, :powerup}
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.right(grid, {1, 2})
nil
Returns whether grid
contains a coord to the right of coord
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.right?(grid, {1, 1})
true
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.right?(grid, {1, 2})
false
An optional predicate can be passed to further test found t:cell
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.right?(grid, {1, 1}, fn {_coord, value} -> value == :powerup end)
true
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 2}, :powerup)
iex> Hold.CoordinateGrid.right?(grid, {1, 1}, fn {_coord, value} -> value == :mine end)
false
@spec traverse( t(), coord :: Hold.Coordinate.t(), acc :: term(), iterator :: (cell(), acc :: term() -> {:cont, Hold.Coordinate.t(), term()} | {:halt, term()}) ) :: term()
Traverse over grid starting at coord
collecting an accumulator value.
iterator
function should return either {:cont, next_coordinate, acc}
to
step to next coordinate, or {:halt, acc}
to return accumulator and stop
traversal.
@spec up(t(), Hold.Coordinate.t()) :: cell()
Get cell upward of coord
in grid
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :powerup)
iex> Hold.CoordinateGrid.up(grid, {1, 1})
{{2, 1}, :mine}
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :powerup)
iex> Hold.CoordinateGrid.up(grid, {2, 1})
nil
Returns whether grid
contains a coord to the upward from coord
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :powerup)
iex> Hold.CoordinateGrid.up?(grid, {1, 1})
true
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :powerup)
iex> Hold.CoordinateGrid.up?(grid, {2, 1})
false
An optional predicate can be passed to further test found t:cell
.
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :powerup)
iex> Hold.CoordinateGrid.up?(grid, {1, 1}, fn {_coord, value} -> value == :mine end)
true
iex> grid = Hold.CoordinateGrid.new()
iex> grid = Hold.CoordinateGrid.add(grid, {2, 1}, :mine)
iex> grid = Hold.CoordinateGrid.add(grid, {1, 1}, :powerup)
iex> Hold.CoordinateGrid.up?(grid, {1, 1}, fn {_coord, value} -> value != :mine end)
false