View Source Hold.CoordinateGrid (hold v0.1.0)

A collection of values held at Hold.Coordinates.

Summary

Types

A representation of a valid t:Hold.Coordinate.t/ in grid and value/0 it is holding.

Representation of item at a Hold.Coordinate.t/0 in t/0.

t()

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
Link to this function

down?(grid, coord, predicate \\ &always_true/1)

View Source
@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
Link to this function

left?(grid, coord, predicate \\ &always_true/1)

View Source
@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
Link to this function

member?(grid, coord, predicate \\ &always_true/1)

View Source
@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
Link to this function

neighbors(grid, coord, predicate \\ &always_true/1)

View Source
@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}]
Link to this function

neighbors?(grid, coord, predicate \\ &always_true/1)

View Source
@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
Link to this function

right?(grid, coord, predicate \\ &always_true/1)

View Source

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
Link to this function

traverse(grid, coordinate, acc, iterator)

View Source
@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
Link to this function

up?(grid, coord, predicate \\ &always_true/1)

View Source

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