-module(gchess). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([perft/2, main/0]). -spec perft(gleam@erlang@process:subject(game_server:message()), integer()) -> integer(). perft(Game_server_subject, Depth) -> case Depth of 0 -> 1; _ -> Moves = game_server:all_legal_moves(Game_server_subject), Nodes@2 = gleam@list:fold( Moves, 0, fun(Nodes, Move) -> _assert_subject = game_server:apply_move_raw( Game_server_subject, Move ), {ok, _} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"gchess"/utf8>>, function => <<"perft"/utf8>>, line => 34}) end, Nodes@1 = Nodes + perft(Game_server_subject, Depth - 1), _assert_subject@1 = game_server:undo_move( Game_server_subject ), {ok, _} = case _assert_subject@1 of {ok, _} -> _assert_subject@1; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail@1, module => <<"gchess"/utf8>>, function => <<"perft"/utf8>>, line => 38}) end, Nodes@1 end ), Nodes@2 end. -spec main() -> {ok, nil} | {error, gleam@otp@actor:start_error()}. main() -> gleam@result:'try'( game_server:new_server(), fun(Server) -> _assert_subject = game_server:new_game_from_fen( Server, <<"8/3k4/8/2BKB3/2PRP3/8/8/8 w - - 0 1"/utf8>> ), {ok, _} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"gchess"/utf8>>, function => <<"main"/utf8>>, line => 10}) end, _assert_subject@1 = game_server:disable_status(Server), {ok, _} = case _assert_subject@1 of {ok, _} -> _assert_subject@1; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail@1, module => <<"gchess"/utf8>>, function => <<"main"/utf8>>, line => 12}) end, Start = os:system_time(second), Perft_result = perft(Server, 2), End = os:system_time(second), gleam@io:print(<<"Perft result: "/utf8>>), gleam@io:print(gleam@int:to_string(Perft_result)), gleam@io:print(<<"\n"/utf8>>), gleam@io:print(<<"Time: "/utf8>>), gleam@io:print(gleam@int:to_string(End - Start)), gleam@io:print(<<" seconds"/utf8>>), gleam@io:print(<<"\n"/utf8>>), {ok, nil} end ).