From 9b55ecea81edbc12196a5818077fd38421f8f1a8 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Thu, 7 Jun 2018 12:47:34 +0200 Subject: Now it seems to work perfectly. Getting both nodes to start made some unexpected issues about the hostnames appear, despite both using either "-name" or "-sname". --- src/battlemap/game-logic/bm_next_turn.erl | 108 ++++++++++++---------- src/battlemap/game-logic/bm_turn_actions.erl | 96 ++++++++----------- src/battlemap/query/bm_character_turn.erl | 36 +++++++- src/battlemap/struct/bm_character_turn_update.erl | 20 +++- src/battlemap/struct/bm_player.erl | 6 +- src/battlemap/util/array_util.erl | 105 --------------------- src/db/logic/db_access.erl | 16 ++++ src/db/struct/db_model.erl | 5 +- src/shared/io/sh_database.erl | 7 ++ src/shared/util/sh_array_util.erl | 105 +++++++++++++++++++++ 10 files changed, 286 insertions(+), 218 deletions(-) delete mode 100644 src/battlemap/util/array_util.erl create mode 100644 src/shared/util/sh_array_util.erl diff --git a/src/battlemap/game-logic/bm_next_turn.erl b/src/battlemap/game-logic/bm_next_turn.erl index abe286e..79cea14 100644 --- a/src/battlemap/game-logic/bm_next_turn.erl +++ b/src/battlemap/game-logic/bm_next_turn.erl @@ -16,20 +16,27 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec set_player_turn_to_next (bm_battle:type()) -> bm_battle:type(). +-spec set_player_turn_to_next (bm_battle:type()) + -> {bm_battle:type(), sh_db_query:op()}. set_player_turn_to_next (Battle) -> Players = bm_battle:get_players(Battle), CurrentPlayerTurn = bm_battle:get_current_player_turn(Battle), NextPlayerTurn = bm_player_turn:next(array:size(Players), CurrentPlayerTurn), - bm_battle:set_current_player_turn(NextPlayerTurn, Battle). + UpdatedBattle = bm_battle:set_current_player_turn(NextPlayerTurn, Battle), --spec reset_next_player_timeline - ( - bm_battle:type() - ) - -> {bm_battle:type(), bm_player:type()}. + DBQuery = + sh_db_query:set_field + ( + bm_battle:get_current_player_turn_field(), + NextPlayerTurn + ), + + {UpdatedBattle, DBQuery}. + +-spec reset_next_player_timeline (bm_battle:type()) + -> {bm_battle:type(), bm_player:type(), sh_db_query:op()}. reset_next_player_timeline (Battle) -> NextPlayerTurn = bm_battle:get_current_player_turn(Battle), NextPlayerIX = bm_player_turn:get_player_ix(NextPlayerTurn), @@ -39,21 +46,25 @@ reset_next_player_timeline (Battle) -> UpdatedBattle = bm_battle:set_player(NextPlayerIX, UpdatedNextPlayer, Battle), - {UpdatedBattle, UpdatedNextPlayer}. + DBQuery = + sh_db_query:update_indexed + ( + bm_battle:get_players_field(), + NextPlayerIX, + [ sh_db_query:set_field(bm_player:get_timeline_field(), []) ] + ), + {UpdatedBattle, UpdatedNextPlayer, DBQuery}. --spec activate_next_players_characters - ( - bm_battle:type(), - bm_player:type() - ) - -> {bm_battle:type(), list(non_neg_integer())}. + +-spec activate_next_players_characters (bm_battle:type(), bm_player:type()) + -> {bm_battle:type(), list(sh_db_query:op())}. activate_next_players_characters (Battle, NextPlayer) -> NextPlayerID = bm_player:get_id(NextPlayer), Characters = bm_battle:get_characters(Battle), {UpdatedCharacters, ModifiedIXs} = - array_util:mapiff + sh_array_util:mapiff ( fun (Character) -> (bm_character:get_owner_id(Character) == NextPlayerID) @@ -64,33 +75,29 @@ activate_next_players_characters (Battle, NextPlayer) -> Characters ), - UpdatedBattle = bm_battle:set_characters(UpdatedCharacters, Battle), + DBQueries = + lists:map + ( + fun (IX) -> + sh_db_query:update_indexed + ( + bm_battle:get_characters_field(), + IX, + [ + sh_db_query:set_field + ( + bm_character:get_active_field(), + true + ) + ] + ) + end, + ModifiedIXs + ), - {UpdatedBattle, ModifiedIXs}. + UpdatedBattle = bm_battle:set_characters(UpdatedCharacters, Battle), --spec add_activation_updates - ( - list(non_neg_integer()), - bm_character_turn_update:type() - ) - -> bm_character_turn_update:type(). -add_activation_updates ([], Update) -> - Update; -add_activation_updates ([IX|NextIXs], Update) -> - add_activation_updates - ( - NextIXs, - bm_character_turn_update:add_to_db - ( - sh_db_query:update_indexed - ( - bm_battle:get_characters_field(), - IX, - [sh_db_query:set_field(bm_character:get_active_field(), true)] - ), - Update - ) - ). + {UpdatedBattle, DBQueries}. -spec update ( @@ -101,16 +108,23 @@ update (Update) -> Data = bm_character_turn_update:get_data(Update), Battle = bm_character_turn_data:get_battle(Data), - S0Battle = set_player_turn_to_next(Battle), - {S1Battle, NextPlayer} = reset_next_player_timeline(S0Battle), - {S2Battle, ActivatedCharactersIX} = + {S0Battle, DBQuery0} = set_player_turn_to_next(Battle), + {S1Battle, NextPlayer, DBQuery1} = reset_next_player_timeline(S0Battle), + {S2Battle, DBQueries} = activate_next_players_characters(S1Battle, NextPlayer), - S0Update = add_activation_updates(ActivatedCharactersIX, Update), + S0Data = bm_character_turn_data:set_battle(S2Battle, Data), + S0Update = bm_character_turn_update:set_data(S0Data, Update), - UpdatedData = bm_character_turn_data:set_battle(S2Battle, Data), + S1Update = + lists:foldl + ( + fun bm_character_turn_update:add_to_db/2, + S0Update, + [DBQuery0|[DBQuery1|DBQueries]] + ), - bm_character_turn_update:set_data(UpdatedData, S0Update). + S1Update. -spec requires_update (bm_character_turn_update:type()) -> boolean(). requires_update (Update) -> @@ -118,7 +132,7 @@ requires_update (Update) -> Battle = bm_character_turn_data:get_battle(Data), Characters = bm_battle:get_characters(Battle), - array_util:none(fun bm_character:get_is_active/1, Characters). + sh_array_util:none(fun bm_character:get_is_active/1, Characters). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/battlemap/game-logic/bm_turn_actions.erl b/src/battlemap/game-logic/bm_turn_actions.erl index bf4075f..e94d36a 100644 --- a/src/battlemap/game-logic/bm_turn_actions.erl +++ b/src/battlemap/game-logic/bm_turn_actions.erl @@ -40,6 +40,8 @@ handle_switch_weapon (Update) -> bm_character:set_weapon_ids(UpdatedWeaponIDs, Character) ), + TimelineItem = bm_turn_result:new_character_switched_weapons(CharacterIX), + DBQuery = sh_db_query:update_indexed ( @@ -57,14 +59,8 @@ handle_switch_weapon (Update) -> UpdatedData = bm_character_turn_data:set_character(UpdatedCharacter, Data), S0Update = bm_character_turn_update:set_data(UpdatedData, Update), - S1Update = - bm_character_turn_update:add_to_timeline - ( - bm_turn_result:new_character_switched_weapons(CharacterIX), - S0Update - ), - bm_character_turn_update:add_to_db(DBQuery, S1Update). + bm_character_turn_update:add_to_timeline(TimelineItem, DBQuery, S0Update). %%%% MOVING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec get_path_cost_and_destination @@ -137,32 +133,32 @@ commit_move (Update, Path, NewLocation) -> UpdatedData = bm_character_turn_data:set_character(UpdatedCharacter, Data), - S0Update = - bm_character_turn_update:add_to_timeline + TimelineItem = + bm_turn_result:new_character_moved(CharacterIX, Path, NewLocation), + + DBQuery = + sh_db_query:update_indexed ( - bm_turn_result:new_character_moved(CharacterIX, Path, NewLocation), - Update + bm_battle:get_characters_field(), + CharacterIX, + [ + sh_db_query:set_field + ( + bm_character:get_location_field(), + NewLocation + ) + ] ), - S1Update = - bm_character_turn_update:add_to_db + S0Update = + bm_character_turn_update:add_to_timeline ( - sh_db_query:update_indexed - ( - bm_battle:get_characters_field(), - CharacterIX, - [ - sh_db_query:set_field - ( - bm_character:get_location_field(), - NewLocation - ) - ] - ), - S0Update + TimelineItem, + DBQuery, + Update ), - bm_character_turn_update:set_data(UpdatedData, S1Update). + bm_character_turn_update:set_data(UpdatedData, S0Update). -spec handle_move ( @@ -282,19 +278,10 @@ handle_attack (BattleAction, Update) -> AttackSequence = get_attack_sequence(Character, TargetCharacter), {AttackEffects, RemainingAttackerHealth, RemainingDefenderHealth} = - handle_attack_sequence - ( - Character, - TargetCharacter, - AttackSequence - ), + handle_attack_sequence(Character, TargetCharacter, AttackSequence), UpdatedCharacter = - bm_character:set_current_health - ( - RemainingAttackerHealth, - Character - ), + bm_character:set_current_health(RemainingAttackerHealth, Character), UpdatedBattle = bm_battle:set_character @@ -310,26 +297,15 @@ handle_attack (BattleAction, Update) -> S0Data = bm_character_turn_data:set_battle(UpdatedBattle, Data), - S1Data = - bm_character_turn_data:set_character - ( - UpdatedCharacter, - S0Data - ), - + S1Data = bm_character_turn_data:set_character(UpdatedCharacter, S0Data), - S0Update = - bm_character_turn_update:add_to_timeline + TimelineItem = + bm_turn_result:new_character_attacked ( - bm_turn_result:new_character_attacked - ( - CharacterIX, - TargetIX, - AttackEffects - ), - Update + CharacterIX, + TargetIX, + AttackEffects ), - S1Update = bm_character_turn_update:set_data(S1Data, S0Update), DBQuery = sh_db_query:update_indexed @@ -345,7 +321,15 @@ handle_attack (BattleAction, Update) -> ] ), - bm_character_turn_update:add_to_db(DBQuery, S1Update). + S0Update = + bm_character_turn_update:add_to_timeline + ( + TimelineItem, + DBQuery, + Update + ), + + bm_character_turn_update:set_data(S1Data, S0Update). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/battlemap/query/bm_character_turn.erl b/src/battlemap/query/bm_character_turn.erl index 26b8dce..ccd9182 100644 --- a/src/battlemap/query/bm_character_turn.erl +++ b/src/battlemap/query/bm_character_turn.erl @@ -114,7 +114,18 @@ finalize_character (Update) -> UpdatedData = bm_character_turn_data:set_character(DisabledCharacter, Data), FinalizedData = bm_character_turn_data:clean_battle(UpdatedData), - bm_character_turn_update:set_data(FinalizedData, Update). + DBQuery = + sh_db_query:update_indexed + ( + bm_battle:get_characters_field(), + bm_character_turn_data:get_character_ix(Data), + [ sh_db_query:set_field(bm_character:get_active_field(), false) ] + ), + + S0Update = bm_character_turn_update:set_data(FinalizedData, Update), + S1Update = bm_character_turn_update:add_to_db(DBQuery, S0Update), + + S1Update. -spec handle_actions ( @@ -148,7 +159,26 @@ update_timeline (Update) -> UpdatedBattle = bm_battle:set_player(PlayerIX, UpdatedPlayer, Battle), UpdatedData = bm_character_turn_data:set_battle(UpdatedBattle, Data), - bm_character_turn_update:set_data(UpdatedData, Update). + DBQuery = + sh_db_query:update_indexed + ( + bm_battle:get_players_field(), + PlayerIX, + [ + sh_db_query:add_to_field + ( + bm_player:get_timeline_field(), + NewTimelineElements, + true % We add those to the start of the list + ) + ] + ), + + S0Update = bm_character_turn_update:set_data(UpdatedData, Update), + S1Update = bm_character_turn_update:add_to_db(DBQuery, S0Update), + + S1Update. + -spec update_data ( @@ -175,8 +205,6 @@ send_to_database (Update, Request) -> Ops = bm_character_turn_update:get_db(Update), Query = sh_db_query:new(battle_db, BattleID, {user, PlayerID}, Ops), - % TODO: send queries to an actual DB... - sh_database:commit(Query), ok. diff --git a/src/battlemap/struct/bm_character_turn_update.erl b/src/battlemap/struct/bm_character_turn_update.erl index 078075c..1ca5d94 100644 --- a/src/battlemap/struct/bm_character_turn_update.erl +++ b/src/battlemap/struct/bm_character_turn_update.erl @@ -30,7 +30,7 @@ get_db/1, set_data/2, - add_to_timeline/2, + add_to_timeline/3, add_to_db/2 ] ). @@ -64,9 +64,21 @@ get_db (Update) -> Update#type.db. set_data (Data, Update) -> Update#type{ data = Data}. --spec add_to_timeline (bm_turn_result:type(), type()) -> type(). -add_to_timeline (Item, Update) -> - Update#type{ timeline = [bm_turn_result:encode(Item)|Update#type.timeline] }. +-spec add_to_timeline + ( + bm_turn_result:type(), + sh_db_query:op(), + type() + ) -> type(). +add_to_timeline (Item, DBUpdate, Update) -> + add_to_db + ( + DBUpdate, + Update#type + { + timeline = [bm_turn_result:encode(Item)|Update#type.timeline] + } + ). -spec add_to_db (sh_db_query:op(), type()) -> type(). add_to_db (Item, Update) -> diff --git a/src/battlemap/struct/bm_player.erl b/src/battlemap/struct/bm_player.erl index 3f14a6f..fa877c1 100644 --- a/src/battlemap/struct/bm_player.erl +++ b/src/battlemap/struct/bm_player.erl @@ -26,7 +26,9 @@ get_id/1, get_timeline/1, add_to_timeline/2, - reset_timeline/1 + reset_timeline/1, + + get_timeline_field/0 ] ). @@ -70,3 +72,5 @@ new (ID) -> timeline = [] }. +-spec get_timeline_field () -> non_neg_integer(). +get_timeline_field () -> #player.timeline. diff --git a/src/battlemap/util/array_util.erl b/src/battlemap/util/array_util.erl deleted file mode 100644 index 418d9ce..0000000 --- a/src/battlemap/util/array_util.erl +++ /dev/null @@ -1,105 +0,0 @@ --module(array_util). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - any/2, - none/2, - all/2, - - mapiff/3 - ] -). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec any_internals - ( - fun((any()) -> boolean()), - array:array(any()), - non_neg_integer() - ) - -> boolean(). -any_internals (_, _, 0) -> - false; -any_internals (Fun, Array, PrevIX) -> - IX = (PrevIX - 1), - case Fun(array:get(IX, Array)) of - true -> true; - _ -> any_internals(Fun, Array, IX) - end. - --spec all_internals - ( - fun((any()) -> boolean()), - array:array(any()), - non_neg_integer() - ) - -> boolean(). -all_internals (_, _, 0) -> - true; -all_internals (Fun, Array, PrevIX) -> - IX = (PrevIX - 1), - case Fun(array:get(IX, Array)) of - true -> any_internals(Fun, Array, IX); - _ -> false - end. - --spec mapiff_internals - ( - fun((any()) -> boolean()), - fun((any()) -> any()), - array:array(any()), - list(non_neg_integer()), - non_neg_integer() - ) - -> {array:array(any()), list(non_neg_integer())}. -mapiff_internals (_, _, Array, IXList, 0) -> - {Array, IXList}; -mapiff_internals (Cond, Map, Array, IXList, PrevIX) -> - IX = (PrevIX - 1), - Elem = array:get(IX, Array), - - case Cond(Elem) of - false -> mapiff_internals(Cond, Map, Array, IXList, IX); - _ -> - mapiff_internals - ( - Cond, - Map, - array:set(IX, Map(Elem), Array), - [IX|IXList], - IX - ) - end. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec any (fun((any()) -> boolean()), array:array(any())) -> boolean(). -any (Fun, Array) -> - any_internals(Fun, Array, array:size(Array)). - --spec all (fun((any()) -> boolean()), array:array(any())) -> boolean(). -all (Fun, Array) -> - all_internals(Fun, Array, array:size(Array)). - --spec none (fun((any()) -> boolean()), array:array(any())) -> boolean(). -none (Fun, Array) -> - not any(Fun, Array). - --spec mapiff - ( - fun((any()) -> boolean()), - fun((any()) -> any()), - array:array(any()) - ) - -> {array:array(any()), list(non_neg_integer())}. -mapiff (Cond, Map, Array) -> - mapiff_internals(Cond, Map, Array, [], array:size(Array)). diff --git a/src/db/logic/db_access.erl b/src/db/logic/db_access.erl index f589ba8..99d17ea 100644 --- a/src/db/logic/db_access.erl +++ b/src/db/logic/db_access.erl @@ -18,12 +18,22 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_value (list(sh_db_item:type())) -> ({'ok', any()} | 'not_found'). get_value ([]) -> not_found; get_value ([Regval]) -> {ok, sh_db_item:get_value(Regval)}. +-spec read_transaction (atom(), any()) -> ({'ok', any()} | 'not_found'). read_transaction (DB, ID) -> get_value(mnesia:read(DB, ID)). +-spec insert_transaction + ( + atom(), + any(), + sh_db_user:permission(), + any() + ) + -> 'ok'. insert_transaction (DB, ID, Perm, Value) -> StoredItem = sh_db_item:new(ID, Perm, Value), % FIXME: handle return value, mnesia:write -> (transaction abort | ok). @@ -31,6 +41,7 @@ insert_transaction (DB, ID, Perm, Value) -> mnesia:write(DB, StoredItem, sticky_write), ok. +-spec query_transaction (sh_db_query:type()) -> 'ok'. query_transaction (Query) -> DB = sh_db_query:get_database(Query), ID = sh_db_query:get_entry_id(Query), @@ -44,11 +55,16 @@ query_transaction (Query) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec read (atom(), any()) + -> ({'aborted', any()} | {'atomic', ({'ok', any()} | 'not_found')}). read (DB, ID) -> mnesia:transaction(fun read_transaction/2, [DB, ID]). +-spec insert (atom(), any(), sh_db_user:permission(), any()) + -> ({'aborted', any()} | {'atomic', 'ok'}). insert (DB, ID, Perm, Value) -> mnesia:transaction(fun insert_transaction/4, [DB, ID, Perm, Value]). +-spec query (sh_db_query:type()) -> ({'aborted', any()} | {'atomic', 'ok'}). query (Query) -> mnesia:transaction(fun query_transaction/1, [Query]). diff --git a/src/db/struct/db_model.erl b/src/db/struct/db_model.erl index 8097bcb..3e00b95 100644 --- a/src/db/struct/db_model.erl +++ b/src/db/struct/db_model.erl @@ -45,6 +45,7 @@ new (DBName, StorageFile, Neighbors) -> neighbors = Neighbors }. +-spec start(type()) -> 'ok'. start (Model) -> DBName = Model#db_model.name, StorageFile = Model#db_model.store_file, @@ -68,4 +69,6 @@ start (Model) -> {type, ordered_set}, {local_content, false} ] - ). + ), + + ok. diff --git a/src/shared/io/sh_database.erl b/src/shared/io/sh_database.erl index 8b52f9e..233e37d 100644 --- a/src/shared/io/sh_database.erl +++ b/src/shared/io/sh_database.erl @@ -19,8 +19,15 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_db_node () -> node(). get_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()). +-spec do_remote_operation (atom(), list(any())) -> + ( + {'badrpc', any()} + | {'aborted', any()} + | {'atomic', ({'ok', any()} | 'ok' | 'not_found')} + ). do_remote_operation (Op, Params) -> rpc:call(get_db_node(), db_access, Op, Params). diff --git a/src/shared/util/sh_array_util.erl b/src/shared/util/sh_array_util.erl new file mode 100644 index 0000000..5f58b36 --- /dev/null +++ b/src/shared/util/sh_array_util.erl @@ -0,0 +1,105 @@ +-module(sh_array_util). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + any/2, + none/2, + all/2, + + mapiff/3 + ] +). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec any_internals + ( + fun((any()) -> boolean()), + array:array(any()), + non_neg_integer() + ) + -> boolean(). +any_internals (_, _, 0) -> + false; +any_internals (Fun, Array, PrevIX) -> + IX = (PrevIX - 1), + case Fun(array:get(IX, Array)) of + true -> true; + _ -> any_internals(Fun, Array, IX) + end. + +-spec all_internals + ( + fun((any()) -> boolean()), + array:array(any()), + non_neg_integer() + ) + -> boolean(). +all_internals (_, _, 0) -> + true; +all_internals (Fun, Array, PrevIX) -> + IX = (PrevIX - 1), + case Fun(array:get(IX, Array)) of + true -> any_internals(Fun, Array, IX); + _ -> false + end. + +-spec mapiff_internals + ( + fun((any()) -> boolean()), + fun((any()) -> any()), + array:array(any()), + list(non_neg_integer()), + non_neg_integer() + ) + -> {array:array(any()), list(non_neg_integer())}. +mapiff_internals (_, _, Array, IXList, 0) -> + {Array, IXList}; +mapiff_internals (Cond, Map, Array, IXList, PrevIX) -> + IX = (PrevIX - 1), + Elem = array:get(IX, Array), + + case Cond(Elem) of + false -> mapiff_internals(Cond, Map, Array, IXList, IX); + _ -> + mapiff_internals + ( + Cond, + Map, + array:set(IX, Map(Elem), Array), + [IX|IXList], + IX + ) + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec any (fun((any()) -> boolean()), array:array(any())) -> boolean(). +any (Fun, Array) -> + any_internals(Fun, Array, array:size(Array)). + +-spec all (fun((any()) -> boolean()), array:array(any())) -> boolean(). +all (Fun, Array) -> + all_internals(Fun, Array, array:size(Array)). + +-spec none (fun((any()) -> boolean()), array:array(any())) -> boolean(). +none (Fun, Array) -> + not any(Fun, Array). + +-spec mapiff + ( + fun((any()) -> boolean()), + fun((any()) -> any()), + array:array(any()) + ) + -> {array:array(any()), list(non_neg_integer())}. +mapiff (Cond, Map, Array) -> + mapiff_internals(Cond, Map, Array, [], array:size(Array)). -- cgit v1.2.3-70-g09d2