Skip to main content

src/ecsalt_system.erl

-module(ecsalt_system).
-moduledoc "Register, list, and unregister callbacks".

-hank([{unused_callbacks, [{proc, 2}]}]).
-callback proc(Data :: term(), World :: ecsalt:world()) -> term().

-include("ecsalt.hrl").

-export([register/2, register/3, unregister/2, list/1]).

-doc """
Register a callback of the form {module, fun, 2} or fun(M,N) that will accept
Data as the first argument and the World reference as the second argument.
""".
-spec register(system(), world()) -> world().
register(Callback, World) ->
    register(Callback, 0, World).

-doc """
The same as register/2, but priority may also be specified. Negative values are
higher priority.
""".
-spec register(system(), integer(), world()) -> world().
register(Callback, Priority, World) ->
    #world{systems = S} = World,
    S0 =
        case lists:keytake(Callback, 2, S) of
            false ->
                S;
            {value, _Tuple, SRest} ->
                % Replace the current value instead
                SRest
        end,
    S1 = lists:keysort(1, [{Priority, Callback} | S0]),
    World#world{systems = S1}.

-doc """
Remove a system from the ECS world.
""".
-spec unregister(system(), world()) -> world().
unregister(Callback, World) ->
    #world{systems = S} = World,
    S1 = lists:keydelete(Callback, 2, S),
    World#world{systems = S1}.

-doc """
List all registered systems and their relative priority
""".
-spec list(world()) -> [tuple()].
list(#world{systems = S}) ->
    S.