From 5bd9ee5c7f1923a935514189aa6f5c279d4ade57 Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Fri, 10 May 2024 15:19:58 +0200 Subject: [PATCH] feat(utils): add `emqx_utils_ets:keyfoldl/3` function Designed to be used with `bag` / `duplicate_bag` tables. --- apps/emqx_utils/src/emqx_utils_ets.erl | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/apps/emqx_utils/src/emqx_utils_ets.erl b/apps/emqx_utils/src/emqx_utils_ets.erl index e737c8934..c2819dbeb 100644 --- a/apps/emqx_utils/src/emqx_utils_ets.erl +++ b/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) ->