forked from japerk/erldis
/
erldis_sets.erl
51 lines (32 loc) · 1.6 KB
/
erldis_sets.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
%% @doc sets like interface to redis. Uses erldis_client to ensure
%% synchronous results.
%%
%% @author Jacob Perkins <japerk@gmail.com>
-module(erldis_sets).
-export([delete/1, is_set/2, size/2, to_list/2, from_list/3, is_element/3,
add_element/3, del_element/3, union/2, intersection/3, intersection/2,
is_disjoint/3, subtract/3, subtract/2, is_subset/3, fold/4, filter/3]).
%%%%%%%%%%%%%%%%%%%
%% sets-like api %%
%%%%%%%%%%%%%%%%%%%
delete(Client) -> erldis_client:stop(Client).
is_set(Client, Key) -> <<"set">> == erldis:type(Client, Key).
size(Client, Key) -> erldis:scard(Client, Key).
to_list(Client, Key) -> erldis:smembers(Client, Key).
from_list(Client, Key, List) ->
% delete existing set
erldis:del(Client, Key),
lists:foreach(fun(Elem) -> add_element(Elem, Client, Key) end, List),
Client.
is_element(Elem, Client, Key) -> erldis:sismember(Client, Key, Elem).
add_element(Elem, Client, Key) -> erldis:sadd(Client, Key, Elem).
del_element(Elem, Client, Key) -> erldis:srem(Client, Key, Elem).
union(Client, Keys) -> erldis:sunion(Client, Keys).
intersection(Client, Key1, Key2) -> intersection(Client, [Key1, Key2]).
intersection(Client, Keys) -> erldis:sintersect(Client, Keys).
is_disjoint(Client, Key1, Key2) -> [] == intersection(Client, [Key1, Key2]).
subtract(Client, Key1, Key2) -> subtract(Client, [Key1, Key2]).
subtract(Client, Keys) -> erldis:sdiff(Client, Keys).
is_subset(Client, Key1, Key2) -> [] == subtract(Client, [Key2, Key1]).
fold(F, Acc0, Client, Key) -> lists:foldl(F, Acc0, to_list(Client, Key)).
filter(Pred, Client, Key) -> lists:filter(Pred, to_list(Client, Key)).