Packages

The essentials of Tic-tac-toe extracted into a library.

Current section

Files

Jump to
xo src xo@internal@board.erl
Raw

src/xo@internal@board.erl

-module(xo@internal@board).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([put/3, in_bounds/1, is_open/2, open_positions/1, map/2, to_tiles/1, to_string/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-file("src/xo/internal/board.gleam", 33).
?DOC(false).
-spec put(
list({{integer(), integer()}, xo@internal@mark:mark()}),
{integer(), integer()},
xo@internal@mark:mark()
) -> list({{integer(), integer()}, xo@internal@mark:mark()}).
put(Board, Pos, Mark) ->
[{Pos, Mark} | Board].
-file("src/xo/internal/board.gleam", 43).
?DOC(false).
-spec in_bounds({integer(), integer()}) -> boolean().
in_bounds(Pos) ->
{R, C} = Pos,
(((R >= 0) andalso (R < 3)) andalso (C >= 0)) andalso (C < 3).
-file("src/xo/internal/board.gleam", 72).
?DOC(false).
-spec tile_to_string(gleam@option:option(xo@internal@mark:mark())) -> binary().
tile_to_string(Tile) ->
case Tile of
{some, Mark} ->
xo@internal@mark:to_string(Mark);
none ->
<<"."/utf8>>
end.
-file("src/xo/internal/board.gleam", 81).
?DOC(false).
-spec key_find(list({GRS, GRT}), GRS) -> gleam@option:option(GRT).
key_find(Keyword_list, Desired_key) ->
case Keyword_list of
[] ->
none;
[{Key, Value} | Rest] ->
case Key =:= Desired_key of
true ->
{some, Value};
false ->
key_find(Rest, Desired_key)
end
end.
-file("src/xo/internal/board.gleam", 39).
?DOC(false).
-spec is_open(
list({{integer(), integer()}, xo@internal@mark:mark()}),
{integer(), integer()}
) -> boolean().
is_open(Board, Pos) ->
key_find(Board, Pos) =:= none.
-file("src/xo/internal/board.gleam", 49).
?DOC(false).
-spec open_positions(list({{integer(), integer()}, xo@internal@mark:mark()})) -> list({integer(),
integer()}).
open_positions(Board) ->
gleam@list:filter(
[{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}, {2, 0}, {2, 1}, {2, 2}],
fun(_capture) -> is_open(Board, _capture) end
).
-file("src/xo/internal/board.gleam", 58).
?DOC(false).
-spec map(
list({{integer(), integer()}, xo@internal@mark:mark()}),
fun(({integer(), integer()}, gleam@option:option(xo@internal@mark:mark())) -> GRP)
) -> list(GRP).
map(Board, F) ->
gleam@list:map(
[{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}, {2, 0}, {2, 1}, {2, 2}],
fun(Pos) -> F(Pos, key_find(Board, Pos)) end
).
-file("src/xo/internal/board.gleam", 62).
?DOC(false).
-spec to_tiles(list({{integer(), integer()}, xo@internal@mark:mark()})) -> list(gleam@option:option(xo@internal@mark:mark())).
to_tiles(Board) ->
map(Board, fun(_, Tile) -> Tile end).
-file("src/xo/internal/board.gleam", 66).
?DOC(false).
-spec to_string(list({{integer(), integer()}, xo@internal@mark:mark()})) -> binary().
to_string(Board) ->
_pipe = Board,
_pipe@1 = map(_pipe, fun(_, Tile) -> tile_to_string(Tile) end),
gleam@string:concat(_pipe@1).