Add dictionary method: pop.
[hope.git] / src / hope_kv_list.erl
CommitLineData
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
70cf8e86 17 , pop/2
03ac148f
SK
18 , iter/2
19 , map/2
20 , filter/2
21 , fold/3
22 , of_kv_list/1
23 , to_kv_list/1
24 ]).
25
26
27-type t(K, V) ::
28 [{K, V}].
29
30
31%% ============================================================================
32%% API
33%% ============================================================================
34
35-spec empty() ->
36 [].
37empty() ->
38 [].
39
40get(T, K) ->
41 case lists:keyfind(K, 1, T)
42 of false -> none
43 ; {K, V} -> {some, V}
44 end.
45
46set(T, K, V) ->
47 lists:keystore(K, 1, T, {K, V}).
48
49update(T, K, F) ->
50 V1Opt = get(T, K),
51 V2 = F(V1Opt),
37c6e98b 52 % TODO: Eliminate the 2nd lookup.
03ac148f
SK
53 set(T, K, V2).
54
70cf8e86
SK
55pop(T1, K) ->
56 case lists:keytake(K, 1, T1)
57 of {value, {K, V}, T2} -> {{some, V}, T2}
58 ; false -> {none , T1}
59 end.
60
c1672ac4 61iter(T, F1) ->
d10156b0 62 F2 = lift_map(F1),
c1672ac4 63 lists:foreach(F2, T).
03ac148f 64
c1672ac4 65map(T, F1) ->
d10156b0
SK
66 F2 = fun ({K, _}=X) -> {K, apply_map(F1, X)} end,
67 lists:map(F2, T).
03ac148f 68
c1672ac4 69filter(T, F1) ->
d10156b0 70 F2 = lift_map(F1),
c1672ac4 71 lists:filter(F2, T).
03ac148f
SK
72
73fold(T, F1, Accumulator) ->
74 F2 = fun ({K, V}, Acc) -> F1(K, V, Acc) end,
75 lists:foldl(F2, T, Accumulator).
76
77to_kv_list(T) ->
78 T.
79
80of_kv_list(List) ->
37c6e98b 81 % TODO: Decide if validation is to be done here. Do so if yes.
03ac148f
SK
82 List.
83
84
85%% ============================================================================
86%% Helpers
87%% ============================================================================
88
48371999
SK
89-spec lift_map(F) ->
90 G
91 when F :: fun(( K, V1 ) -> V2)
92 , G :: fun(({K, V1}) -> V2)
93 .
d10156b0
SK
94lift_map(F) ->
95 fun (X) -> apply_map(F, X) end.
96
48371999
SK
97-spec apply_map(fun((K, V1) -> V2), {K, V1}) ->
98 V2.
d10156b0
SK
99apply_map(F, {K, V}) ->
100 F(K, V).
This page took 0.023237 seconds and 4 git commands to generate.