summaryrefslogtreecommitdiff |
diff options
author | nsensfel <SpamShield0@noot-noot.org> | 2018-07-11 18:02:26 +0200 |
---|---|---|
committer | nsensfel <SpamShield0@noot-noot.org> | 2018-07-11 18:02:26 +0200 |
commit | acb9dd3220a3edcac93aa11d1d74d008e2fb23ed (patch) | |
tree | 98b45af3f7eb9c7d812ed33a07e6a0f665a7a8cd /src/shared/util/shr_array_util.erl | |
parent | fde827cba1ff3d889135c74ee1978098465fd200 (diff) |
"sh_" -> "shr_".
Diffstat (limited to 'src/shared/util/shr_array_util.erl')
-rw-r--r-- | src/shared/util/shr_array_util.erl | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/shared/util/shr_array_util.erl b/src/shared/util/shr_array_util.erl new file mode 100644 index 0000000..0faff99 --- /dev/null +++ b/src/shared/util/shr_array_util.erl @@ -0,0 +1,152 @@ +-module(shr_array_util). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + any/2, + any_indexed/2, + none/2, + all/2, + + first/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 first_internals + ( + fun((any()) -> boolean()), + array:array(any()), + non_neg_integer() + ) + -> integer(). +first_internals (_, _, 0) -> + -1; +first_internals (Fun, Array, PrevIX) -> + IX = (PrevIX - 1), + case Fun(array:get(IX, Array)) of + true -> IX; + _ -> first_internals(Fun, Array, IX) + end. + +-spec any_indexed_internals + ( + fun((non_neg_integer(), any()) -> boolean()), + array:array(any()), + non_neg_integer() + ) + -> boolean(). +any_indexed_internals (_, _, 0) -> + false; +any_indexed_internals (Fun, Array, PrevIX) -> + IX = (PrevIX - 1), + case Fun(IX, array:get(IX, Array)) of + true -> true; + _ -> any_indexed_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 first (fun((any()) -> boolean()), array:array(any())) -> integer(). +first (Fun, Array) -> + first_internals(Fun, Array, array:size(Array)). + +-spec any_indexed + ( + fun((non_neg_integer(), any()) -> boolean()), + array:array(any()) + ) -> boolean(). +any_indexed (Fun, Array) -> + any_indexed_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)). |