Current section
Files
Jump to
Current section
Files
src/xo@internal@referee.erl
-module(xo@internal@referee).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([decide/2]).
-export_type([outcome/0, location/0]).
-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).
-type outcome() :: {win, xo@internal@mark:mark(), list(location())} |
{draw, xo@internal@mark:mark()}.
-type location() :: r1 | r2 | r3 | c1 | c2 | c3 | d1 | d2.
-file("src/xo/internal/referee.gleam", 44).
?DOC(false).
-spec to_winning_arrangements(
list(gleam@option:option(xo@internal@mark:mark()))
) -> list({{gleam@option:option(xo@internal@mark:mark()),
gleam@option:option(xo@internal@mark:mark()),
gleam@option:option(xo@internal@mark:mark())},
location()}).
to_winning_arrangements(Tiles) ->
case Tiles of
[A, B, C, D, E, F, G, H, I] ->
[{{A, B, C}, r1},
{{D, E, F}, r2},
{{G, H, I}, r3},
{{A, D, G}, c1},
{{B, E, H}, c2},
{{C, F, I}, c3},
{{A, E, I}, d1},
{{C, E, G}, d2}];
_ ->
[]
end.
-file("src/xo/internal/referee.gleam", 36).
?DOC(false).
-spec find_win(
list(gleam@option:option(xo@internal@mark:mark())),
xo@internal@mark:mark()
) -> list(location()).
find_win(Tiles, Mark) ->
T = {some, Mark},
_pipe = Tiles,
_pipe@1 = to_winning_arrangements(_pipe),
gleam@list:key_filter(_pipe@1, {T, T, T}).
-file("src/xo/internal/referee.gleam", 63).
?DOC(false).
-spec is_draw(list(gleam@option:option(xo@internal@mark:mark()))) -> boolean().
is_draw(Tiles) ->
_pipe = Tiles,
gleam@list:all(_pipe, fun(T) -> T /= none end).
-file("src/xo/internal/referee.gleam", 22).
?DOC(false).
-spec decide(
list({{integer(), integer()}, xo@internal@mark:mark()}),
xo@internal@mark:mark()
) -> gleam@option:option(outcome()).
decide(Board, Mark) ->
Tiles = xo@internal@board:to_tiles(Board),
case find_win(Tiles, Mark) of
[] ->
case is_draw(Tiles) of
true ->
{some, {draw, Mark}};
false ->
none
end;
Locations ->
{some, {win, Mark, Locations}}
end.