Add dictionary method: pop.
[hope.git] / src / hope_kv_list.erl
index 431932f..ebc4176 100644 (file)
@@ -14,6 +14,7 @@
     , get/2
     , set/3
     , update/3
+    , pop/2
     , iter/2
     , map/2
     , filter/2
@@ -51,17 +52,22 @@ update(T, K, F) ->
     % TODO: Eliminate the 2nd lookup.
     set(T, K, V2).
 
+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(F1),
+    F2 = lift_map(F1),
     lists:foreach(F2, T).
 
 map(T, F1) ->
-    F2 = lift(F1),
-    F3 = fun ({K, _}=X) -> {K, F2(X)} end,
-    lists:map(F3, T).
+    F2 = fun ({K, _}=X) -> {K, apply_map(F1, X)} end,
+    lists:map(F2, T).
 
 filter(T, F1) ->
-    F2 = lift(F1),
+    F2 = lift_map(F1),
     lists:filter(F2, T).
 
 fold(T, F1, Accumulator) ->
@@ -80,5 +86,15 @@ of_kv_list(List) ->
 %% Helpers
 %% ============================================================================
 
-lift(F) ->
-    fun ({K, V}) -> F(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.023696 seconds and 4 git commands to generate.