summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/io/sh_database.erl7
-rw-r--r--src/shared/util/sh_array_util.erl105
2 files changed, 112 insertions, 0 deletions
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)).