]> granicus.if.org Git - ejabberd/commitdiff
delete/2 now does not crash when there is nothing to delete. fold/1 added
authorEvgeniy Khramtsov <xramtsov@gmail.com>
Wed, 22 Jul 2009 06:46:07 +0000 (06:46 +0000)
committerEvgeniy Khramtsov <xramtsov@gmail.com>
Wed, 22 Jul 2009 06:46:07 +0000 (06:46 +0000)
SVN Revision: 2383

src/treap.erl

index ab5c4d33f0530572e484b6ebbd578dff0944389d..360f543dead4c47b5c46a28f397640dfe1fe8ae9 100644 (file)
@@ -32,7 +32,8 @@
         delete_root/1,
         get_root/1,
         lookup/2,
-        is_empty/1]).
+        is_empty/1,
+        fold/3]).
 
 empty() ->
     nil.
@@ -105,6 +106,8 @@ delete(Key, Tree) ->
     HashKey = {erlang:phash2(Key), Key},
     delete1(HashKey, Tree).
 
+delete1(_HashKey, nil) ->
+    nil;
 delete1(HashKey, {HashKey1, Priority1, Value1, Left, Right} = Tree) ->
     if
        HashKey < HashKey1 ->
@@ -162,3 +165,9 @@ lookup1({HashKey1, Priority1, Value1, Left, Right}, HashKey) ->
            {ok, Priority1, Value1}
     end.
 
+fold(_F, Acc, nil) ->
+    Acc;
+fold(F, Acc, {{_Hash, Key}, Priority, Value, Left, Right}) ->
+    Acc1 = F({Key, Priority, Value}, Acc),
+    Acc2 = fold(F, Acc1, Left),
+    fold(F, Acc2, Right).