Bladeren bron

feat(utils): add `emqx_utils_ets:keyfoldl/3` function

Designed to be used with `bag` / `duplicate_bag` tables.
Andrew Mayorov 1 jaar geleden
bovenliggende
commit
5bd9ee5c7f
1 gewijzigde bestanden met toevoegingen van 20 en 0 verwijderingen
  1. 20 0
      apps/emqx_utils/src/emqx_utils_ets.erl

+ 20 - 0
apps/emqx_utils/src/emqx_utils_ets.erl

@@ -26,6 +26,8 @@
     lookup_value/3
 ]).
 
+-export([keyfoldl/3]).
+
 -export([delete/1]).
 
 %% Create an ets table.
@@ -57,6 +59,24 @@ lookup_value(Tab, Key, Def) ->
         error:badarg -> Def
     end.
 
+-spec keyfoldl(fun((_Key :: term(), Acc) -> Acc), Acc, ets:tab()) -> Acc.
+keyfoldl(F, Acc, Tab) ->
+    true = ets:safe_fixtable(Tab, true),
+    First = ets:first(Tab),
+    try
+        keyfoldl(F, Acc, First, Tab)
+    after
+        ets:safe_fixtable(Tab, false)
+    end.
+
+keyfoldl(F, Acc, Key, Tab) ->
+    case Key of
+        '$end_of_table' ->
+            Acc;
+        _ ->
+            keyfoldl(F, F(Key, Acc), ets:next(Tab, Key), Tab)
+    end.
+
 %% Delete the ets table.
 -spec delete(ets:tab()) -> ok.
 delete(Tab) ->