Current section

Files

Jump to
erlang_behaviour_trees src bt_engine bt_helper.erl
Raw

src/bt_engine/bt_helper.erl

-module(bt_helper).
-include("bt_nodes.hrl").
-export([
make_task/3,
make_decorator/3,
make_erl_tree/2,
decorate/2
]).
make_task(Module, Args, Name) ->
#task{
name = Name,
module = Module,
args = Args
}.
%% child will be set later using bt_helper:decorate
make_decorator(Module, Args, Name) ->
#decorator{
name = Name,
module = Module,
args = Args
}.
make_erl_tree(BtErlTree, Args) when is_record(BtErlTree, bt_erl_tree) ->
BtErlTree#bt_erl_tree{args = Args}.
%% single decorator passed
decorate(Node, Decorator) when is_record(Decorator, decorator) ->
decorate_internal(Node, [Decorator]);
%% reverse list since more intuitive to specify higher decorator before lower decorator
decorate(Node, DecoratorList) when is_list(DecoratorList) ->
decorate_internal(Node, lists:reverse(DecoratorList)).
decorate_internal(Node, []) ->
Node;
decorate_internal(Node, [Decorator | RestOfDecorators]) when is_record(Decorator, decorator) ->
DecoratedOnce = Decorator#decorator{
child = Node
},
decorate_internal(DecoratedOnce, RestOfDecorators).