diff options
author | Robert Dionne <bob@cloudant.com> | 2011-02-28 15:55:59 -0500 |
---|---|---|
committer | Adam Kocoloski <adam@cloudant.com> | 2011-04-19 11:36:07 -0400 |
commit | 663d04f907ba0f8e23bab0eb2492c431246974fa (patch) | |
tree | 39263285f28fd1f4bbfd029761eaf14093706236 /apps | |
parent | 7d1adfaf7d67c7e0af837b8067850b7ea0b7f95a (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.erl | 27 |
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]) -> |