summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Gustavsson <bjorn@erlang.org>2023-05-04 13:20:31 +0200
committerGitHub <noreply@github.com>2023-05-04 13:20:31 +0200
commit7f6dfbbf820179500f17478b8ef0d4dfd9947f46 (patch)
tree2f735e52a3f12944294d04a9294349dc39cf4869
parented44a7cab39024bf320b89bb94de63388f24b889 (diff)
parent83744bb43d741c32066fe81a6cc7a4a397717f63 (diff)
downloaderlang-7f6dfbbf820179500f17478b8ef0d4dfd9947f46.tar.gz
Merge pull request #7196 from juhlig/sets_v2_filter_mapgen
Use map generator in sets:filter/2 for version 2 sets
-rw-r--r--lib/stdlib/src/sets.erl17
1 files changed, 3 insertions, 14 deletions
diff --git a/lib/stdlib/src/sets.erl b/lib/stdlib/src/sets.erl
index 816fb85a48..dccc6dcf3a 100644
--- a/lib/stdlib/src/sets.erl
+++ b/lib/stdlib/src/sets.erl
@@ -466,23 +466,12 @@ fold_1(Fun, Acc, Iter) ->
Set1 :: set(Element),
Set2 :: set(Element).
filter(F, #{}=D) when is_function(F, 1)->
- maps:from_keys(filter_1(F, maps:iterator(D)), ?VALUE);
+ %% For this purpose, it is more efficient to use
+ %% maps:from_keys than a map comprehension.
+ maps:from_keys([K || K := _ <- D, F(K)], ?VALUE);
filter(F, #set{}=D) when is_function(F, 1)->
filter_set(F, D).
-filter_1(Fun, Iter) ->
- case maps:next(Iter) of
- {K, _, NextIter} ->
- case Fun(K) of
- true ->
- [K | filter_1(Fun, NextIter)];
- false ->
- filter_1(Fun, NextIter)
- end;
- none ->
- []
- end.
-
%% get_slot(Hashdb, Key) -> Slot.
%% Get the slot. First hash on the new range, if we hit a bucket
%% which has not been split use the unsplit buddy bucket.