X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=src%2Fhope_kv_list.erl;fp=src%2Fhope_kv_list.erl;h=0b80a4aba75933d85fa41f2e89880df593dc7e58;hb=03ac148f8fdf338c85532a61b59ca1152ed7a5d0;hp=0000000000000000000000000000000000000000;hpb=cd69f1f3699412fbb3fa8d304f5a377d83efc8ff;p=hope.git diff --git a/src/hope_kv_list.erl b/src/hope_kv_list.erl new file mode 100644 index 0000000..0b80a4a --- /dev/null +++ b/src/hope_kv_list.erl @@ -0,0 +1,81 @@ +%%%---------------------------------------------------------------------------- +%%% Equivalent to stdlib's orddict, but with a pretty (IMO), uniform interface. +%%%---------------------------------------------------------------------------- +-module(hope_kv_list). + +-behavior(hope_dictionary). + +-export_type( + [ t/2 + ]). + +-export( + [ empty/0 + , get/2 + , set/3 + , update/3 + , iter/2 + , map/2 + , filter/2 + , fold/3 + , of_kv_list/1 + , to_kv_list/1 + ]). + + +-type t(K, V) :: + [{K, V}]. + + +%% ============================================================================ +%% API +%% ============================================================================ + +-spec empty() -> + []. +empty() -> + []. + +get(T, K) -> + case lists:keyfind(K, 1, T) + of false -> none + ; {K, V} -> {some, V} + end. + +set(T, K, V) -> + lists:keystore(K, 1, T, {K, V}). + +update(T, K, F) -> + V1Opt = get(T, K), + V2 = F(V1Opt), + set(T, K, V2). + +iter(T, Map1) -> + Map2 = lift_map_into_list(Map1), + lists:foreach(Map2, T). + +map(T, Map1) -> + Map2 = lift_map_into_list(Map1), + lists:map(Map2, T). + +filter(T, Map1) -> + Map2 = lift_map_into_list(Map1), + lists:filter(Map2, T). + +fold(T, F1, Accumulator) -> + F2 = fun ({K, V}, Acc) -> F1(K, V, Acc) end, + lists:foldl(F2, T, Accumulator). + +to_kv_list(T) -> + T. + +of_kv_list(List) -> + List. + + +%% ============================================================================ +%% Helpers +%% ============================================================================ + +lift_map_into_list(Map) -> + fun ({K, V}) -> {K, Map(K, V)} end.