Add dictionary method: pop.
[hope.git] / src / hope_kv_list.erl
index 0b80a4a..ebc4176 100644 (file)
@@ -14,6 +14,7 @@
     , get/2
     , set/3
     , update/3
+    , pop/2
     , iter/2
     , map/2
     , filter/2
@@ -48,19 +49,26 @@ set(T, K, V) ->
 update(T, K, F) ->
     V1Opt = get(T, K),
     V2 = F(V1Opt),
+    % TODO: Eliminate the 2nd lookup.
     set(T, K, V2).
 
-iter(T, Map1) ->
-    Map2 = lift_map_into_list(Map1),
-    lists:foreach(Map2, T).
+pop(T1, K) ->
+    case lists:keytake(K, 1, T1)
+    of  {value, {K, V}, T2} -> {{some, V}, T2}
+    ;   false               -> {none     , T1}
+    end.
+
+iter(T, F1) ->
+    F2 = lift_map(F1),
+    lists:foreach(F2, T).
 
-map(T, Map1) ->
-    Map2 = lift_map_into_list(Map1),
-    lists:map(Map2, T).
+map(T, F1) ->
+    F2 = fun ({K, _}=X) -> {K, apply_map(F1, X)} end,
+    lists:map(F2, T).
 
-filter(T, Map1) ->
-    Map2 = lift_map_into_list(Map1),
-    lists:filter(Map2, T).
+filter(T, F1) ->
+    F2 = lift_map(F1),
+    lists:filter(F2, T).
 
 fold(T, F1, Accumulator) ->
     F2 = fun ({K, V}, Acc) -> F1(K, V, Acc) end,
@@ -70,6 +78,7 @@ to_kv_list(T) ->
     T.
 
 of_kv_list(List) ->
+    % TODO: Decide if validation is to be done here. Do so if yes.
     List.
 
 
@@ -77,5 +86,15 @@ of_kv_list(List) ->
 %% Helpers
 %% ============================================================================
 
-lift_map_into_list(Map) ->
-    fun ({K, V}) -> {K, Map(K, V)} end.
+-spec lift_map(F) ->
+    G
+    when F :: fun(( K, V1 ) -> V2)
+       , G :: fun(({K, V1}) -> V2)
+       .
+lift_map(F) ->
+    fun (X) -> apply_map(F, X) end.
+
+-spec apply_map(fun((K, V1) -> V2), {K, V1}) ->
+    V2.
+apply_map(F, {K, V}) ->
+    F(K, V).
This page took 0.028737 seconds and 4 git commands to generate.