diff options
author | Harald Welte <laforge@gnumonks.org> | 2011-03-07 23:54:04 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2011-03-07 23:54:04 +0100 |
commit | 4a0afae440a8581274bd2161f10fd4ce669abe39 (patch) | |
tree | 7df61ee6b8b330c25797a3e93906db9404dabde2 /src/osmo_util.erl | |
parent | cf43601fbe9e635900f702ec96e8d5e6e772f5be (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.erl | 20 |
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, |