Commit | Line | Data |
---|---|---|
03ac148f SK |
1 | %%%---------------------------------------------------------------------------- |
2 | %%% Equivalent to stdlib's orddict, but with a pretty (IMO), uniform interface. | |
3 | %%%---------------------------------------------------------------------------- | |
4 | -module(hope_kv_list). | |
5 | ||
6 | -behavior(hope_dictionary). | |
7 | ||
8 | -export_type( | |
9 | [ t/2 | |
10 | ]). | |
11 | ||
12 | -export( | |
13 | [ empty/0 | |
14 | , get/2 | |
15 | , set/3 | |
16 | , update/3 | |
17 | , iter/2 | |
18 | , map/2 | |
19 | , filter/2 | |
20 | , fold/3 | |
21 | , of_kv_list/1 | |
22 | , to_kv_list/1 | |
23 | ]). | |
24 | ||
25 | ||
26 | -type t(K, V) :: | |
27 | [{K, V}]. | |
28 | ||
29 | ||
30 | %% ============================================================================ | |
31 | %% API | |
32 | %% ============================================================================ | |
33 | ||
34 | -spec empty() -> | |
35 | []. | |
36 | empty() -> | |
37 | []. | |
38 | ||
39 | get(T, K) -> | |
40 | case lists:keyfind(K, 1, T) | |
41 | of false -> none | |
42 | ; {K, V} -> {some, V} | |
43 | end. | |
44 | ||
45 | set(T, K, V) -> | |
46 | lists:keystore(K, 1, T, {K, V}). | |
47 | ||
48 | update(T, K, F) -> | |
49 | V1Opt = get(T, K), | |
50 | V2 = F(V1Opt), | |
37c6e98b | 51 | % TODO: Eliminate the 2nd lookup. |
03ac148f SK |
52 | set(T, K, V2). |
53 | ||
54 | iter(T, Map1) -> | |
55 | Map2 = lift_map_into_list(Map1), | |
56 | lists:foreach(Map2, T). | |
57 | ||
58 | map(T, Map1) -> | |
59 | Map2 = lift_map_into_list(Map1), | |
60 | lists:map(Map2, T). | |
61 | ||
62 | filter(T, Map1) -> | |
63 | Map2 = lift_map_into_list(Map1), | |
64 | lists:filter(Map2, T). | |
65 | ||
66 | fold(T, F1, Accumulator) -> | |
67 | F2 = fun ({K, V}, Acc) -> F1(K, V, Acc) end, | |
68 | lists:foldl(F2, T, Accumulator). | |
69 | ||
70 | to_kv_list(T) -> | |
71 | T. | |
72 | ||
73 | of_kv_list(List) -> | |
37c6e98b | 74 | % TODO: Decide if validation is to be done here. Do so if yes. |
03ac148f SK |
75 | List. |
76 | ||
77 | ||
78 | %% ============================================================================ | |
79 | %% Helpers | |
80 | %% ============================================================================ | |
81 | ||
82 | lift_map_into_list(Map) -> | |
83 | fun ({K, V}) -> {K, Map(K, V)} end. |