Add has_key/2 dictionary method.
[hope.git] / src / hope_kv_list.erl
index 2000098..c12f3b4 100644 (file)
@@ -13,8 +13,9 @@
 
 -export(
     [ empty/0
-    , get/2
-    , get/3
+    , get/2  % get option
+    , get/3  % get existing or default
+    , get/4  % get existing if valid, or default
     , set/3
     , update/3
     , pop/2
@@ -24,6 +25,7 @@
     , fold/3
     , of_kv_list/1
     , to_kv_list/1
+    , has_key/2
     , find_unique_presence_violations/2  % No optional keys
     , find_unique_presence_violations/3  % Specify optional keys
     , validate_unique_presence/2  % No optional keys
@@ -75,6 +77,13 @@ get(T, K, Default) ->
     Vopt = get(T, K),
     hope_option:get(Vopt, Default).
 
+-spec get(t(K, V), K, V, fun((V) -> boolean())) ->
+    V.
+get(T, K, Default, IsValid) ->
+    VOpt1 = get(T, K),
+    VOpt2 = hope_option:validate(VOpt1, IsValid),
+    hope_option:get(VOpt2, Default).
+
 -spec set(t(K, V), K, V) ->
     t(K, V).
 set(T, K, V) ->
@@ -131,14 +140,16 @@ of_kv_list(List) ->
     % TODO: Decide if validation is to be done here. Do so if yes.
     List.
 
--spec validate_unique_presence(t(K, _V), [K]) ->
-    hope_result:t(ok, [presence_error(K)]).
+-spec validate_unique_presence(T, [K]) ->
+    hope_result:t(T, [presence_error(K)])
+    when T :: t(K, _V).
 validate_unique_presence(T, KeysRequired) ->
     KeysOptional = [],
     validate_unique_presence(T, KeysRequired, KeysOptional).
 
 -spec validate_unique_presence(t(K, _V), [K], [K]) ->
-    hope_result:t(ok, [presence_error(K)]).
+    hope_result:t(T, [presence_error(K)])
+    when T :: t(K, _V).
 validate_unique_presence(T, KeysRequired, KeysOptional) ->
     case find_unique_presence_violations(T, KeysRequired, KeysOptional)
     of  #hope_kv_list_presence_violations
@@ -146,7 +157,7 @@ validate_unique_presence(T, KeysRequired, KeysOptional) ->
         , keys_duplicated  = []
         , keys_unsupported = []
         } ->
-            {ok, ok}
+            {ok, T}
     ;   #hope_kv_list_presence_violations{}=Violations ->
             {error, presence_violations_to_list(Violations)}
     end.
@@ -196,6 +207,10 @@ presence_violations_to_list(#hope_kv_list_presence_violations
         end,
     ErrorDups ++ ErrorMissing ++ ErrorUnsupported.
 
+-spec has_key(t(K, _), K) ->
+    boolean().
+has_key(T, K1) ->
+    lists:any(fun ({K2, _}) -> K1 =:= K2 end, T).
 
 %% ============================================================================
 %% Helpers
This page took 0.030564 seconds and 4 git commands to generate.