summaryrefslogtreecommitdiffstats
path: root/src/osmo_util.erl
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2011-03-07 23:54:04 +0100
committerHarald Welte <laforge@gnumonks.org>2011-03-07 23:54:04 +0100
commit4a0afae440a8581274bd2161f10fd4ce669abe39 (patch)
tree7df61ee6b8b330c25797a3e93906db9404dabde2 /src/osmo_util.erl
parentcf43601fbe9e635900f702ec96e8d5e6e772f5be (diff)
[osmo_util:tuple_walk] Add support to properly traverse lists (of tuples)
Diffstat (limited to 'src/osmo_util.erl')
-rw-r--r--src/osmo_util.erl20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/osmo_util.erl b/src/osmo_util.erl
index 60a9714..7ddb527 100644
--- a/src/osmo_util.erl
+++ b/src/osmo_util.erl
@@ -86,7 +86,23 @@ tuple_walk(Path, Tpl, TupleCb) when is_list(Path), is_tuple(Tpl) ->
NewTpl = TupleCb(Path, Tpl),
[TplName|TplList] = tuple_to_list(NewTpl),
NewTplList = tuple_fieldlist_walk(Path, TplName, TplList, TupleCb),
- list_to_tuple([TplName|NewTplList]).
+ list_to_tuple([TplName|NewTplList]);
+tuple_walk(Path, TplL, TupleCb) when is_list(Path), is_list(TplL) ->
+ tuple_walk_list(Path, TplL, TupleCb, []).
+
+tuple_walk_list(_Path, [], _TupleCb, OutList) ->
+ OutList;
+tuple_walk_list(Path, [Head|Tail], TupleCb, OutList) ->
+ if
+ is_tuple(Head) ->
+ NewHead = tuple_walk(Path, Head, TupleCb);
+ is_list(Head) ->
+ NewHead = tuple_walk(Path, Head, TupleCb);
+ true ->
+ NewHead = Head
+ end,
+ tuple_walk_list(Path, Tail, TupleCb, OutList++[NewHead]).
+
tuple_fieldlist_walk(Path, TplName, FieldList, TupleCb) ->
tuple_fieldlist_walk(Path, TplName, FieldList, TupleCb, []).
@@ -97,6 +113,8 @@ tuple_fieldlist_walk(Path, TplName, [Head|List], TupleCb, OutList) ->
if
is_tuple(Head) ->
NewHead = tuple_walk(Path++[TplName], Head, TupleCb);
+ is_list(Head) ->
+ NewHead = tuple_walk(Path++[TplName], Head, TupleCb);
true ->
NewHead = Head
end,