Add get with default to dictionary interface.
[hope.git] / src / hope_kv_list.erl
index fb061b5..d9a8177 100644 (file)
@@ -3,7 +3,7 @@
 %%%----------------------------------------------------------------------------
 -module(hope_kv_list).
 
--behavior(hope_dictionary).
+-behavior(hope_gen_dictionary).
 
 -export_type(
     [ t/2
@@ -12,6 +12,7 @@
 -export(
     [ empty/0
     , get/2
+    , get/3
     , set/3
     , update/3
     , pop/2
     , fold/3
     , of_kv_list/1
     , to_kv_list/1
+    , validate_unique_presence/2  % Assume default optional parameter(s)
+    , validate_unique_presence/3  % Specify optional parameter(s)
     ]).
 
 
 -type t(K, V) ::
     [{K, V}].
 
+-type presence_error(A) ::
+      {keys_missing     , [A]}
+    | {keys_duplicated  , [A]}
+    | {keys_unsupported , [A]}
+    .
+
 
 %% ============================================================================
 %% API
@@ -45,6 +54,12 @@ get(T, K) ->
     ;   {K, V} -> {some, V}
     end.
 
+-spec get(t(K, V), K, V) ->
+    V.
+get(T, K, Default) ->
+    Vopt = get(T, K),
+    hope_option:get(Vopt, Default).
+
 -spec set(t(K, V), K, V) ->
     t(K, V).
 set(T, K, V) ->
@@ -101,6 +116,44 @@ 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)]).
+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)]).
+validate_unique_presence(T, KeysRequired, KeysOptional) ->
+    KeysSupported   = KeysRequired ++ KeysOptional,
+    KeysGiven       = [K || {K, _V} <- T],
+    KeysGivenUnique = lists:usort(KeysGiven),
+    KeysDups        = lists:usort(KeysGiven -- KeysGivenUnique),
+    KeysMissing     = KeysRequired -- KeysGivenUnique,
+    KeysUnsupported = KeysGivenUnique -- KeysSupported,
+    case {KeysDups, KeysMissing, KeysUnsupported}
+    of  {[], [], []} ->
+            {ok, ok}
+    ;   {Dups, Missing, Unsupported} ->
+            ErrorDups =
+                case Dups
+                of  []    -> []
+                ;   [_|_] -> [{keys_duplicated, Dups}]
+                end,
+            ErrorMissing =
+                case Missing
+                of  []    -> []
+                ;   [_|_] -> [{keys_missing, Missing}]
+                end,
+            ErrorUnsupported =
+                case Unsupported
+                of  []    -> []
+                ;   [_|_] -> [{keys_unsupported, Unsupported}]
+                end,
+            Errors = ErrorDups ++ ErrorMissing ++ ErrorUnsupported,
+            {error, Errors}
+    end.
+
 
 %% ============================================================================
 %% Helpers
This page took 0.027347 seconds and 4 git commands to generate.