summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorRobert Dionne <bob@cloudant.com>2011-02-28 15:55:59 -0500
committerAdam Kocoloski <adam@cloudant.com>2011-04-19 11:36:07 -0400
commit663d04f907ba0f8e23bab0eb2492c431246974fa (patch)
tree39263285f28fd1f4bbfd029761eaf14093706236 /apps
parent7d1adfaf7d67c7e0af837b8067850b7ea0b7f95a (diff)
BugzID:9995 Add a tree foldl function to couch_key_tree.
This function can be used by many of the existing functions in couch_key_tree that need to walk the revision tree, apply a function at each branch or leaf, and then accumulate results.
Diffstat (limited to 'apps')
-rw-r--r--apps/couch/src/couch_key_tree.erl27
1 files changed, 27 insertions, 0 deletions
diff --git a/apps/couch/src/couch_key_tree.erl b/apps/couch/src/couch_key_tree.erl
index 6701da58..9ec444ac 100644
--- a/apps/couch/src/couch_key_tree.erl
+++ b/apps/couch/src/couch_key_tree.erl
@@ -278,6 +278,33 @@ count_leafs_simple([{_Key, _Value, SubTree} | RestTree]) ->
count_leafs_simple(SubTree) + count_leafs_simple(RestTree).
+foldl(_Fun, Acc, []) ->
+ Acc;
+
+foldl(Fun, Acc, [{Pos, Branch} | Rest]) ->
+ Acc1 = foldl_simple(Fun, Pos, [Branch], Acc),
+ foldl(Fun, Acc1, Rest).
+
+foldl_simple(_Fun, _Pos, [], Acc) ->
+ Acc;
+
+foldl_simple(Fun, Pos, [{Key, Value, []} | RestTree], Acc) ->
+ case Fun({Pos, Key, Value}, leaf, Acc) of
+ {ok, Acc1} ->
+ foldl_simple(Fun, Pos, RestTree, Acc1);
+ {stop, Acc1} ->
+ Acc1
+ end;
+
+foldl_simple(Fun, Pos, [{Key, Value, SubTree} | RestTree], Acc) ->
+ Acc1 = foldl_simple(Fun, Pos + 1, SubTree, Acc),
+ case Fun({Pos, Key, Value}, branch, Acc1) of
+ {ok, Acc2} ->
+ foldl_simple(Fun, Pos, RestTree, Acc2);
+ {stop, Acc2} ->
+ Acc2
+ end.
+
map(_Fun, []) ->
[];
map(Fun, [{Pos, Tree}|Rest]) ->