-module(nm_nesting). -moduledoc false. -export([nest/1, nest/2, unnest/1, unnest/3]). -define(is_nested(D), is_map(D); is_list(D)). nest(NestedTable) -> {ok, Value} = nm_node:get_value(NestedTable, root), nest(NestedTable, Value). nest(NestedTable, Data) when is_list(Data) -> Fun = fun ({'$nm_ref', ItemID}) -> {ok, Value} = nm_node:get_value(NestedTable, ItemID), nest(NestedTable, Value); (Value) -> Value end, lists:map(Fun, Data); nest(NestedTable, Data) when is_map(Data) -> Fun = fun (_Key, {'$nm_ref', ItemID}) -> {ok, Value} = nm_node:get_value(NestedTable, ItemID), nest(NestedTable, Value); (_Key, Value) -> Value end, maps:map(Fun, Data). unnest(Data) when ?is_nested(Data) -> NestedTable = ets:new('$nm_table', [set, protected]), NestedData = unnest(NestedTable, Data, root), ets:insert(NestedTable, {root, null, NestedData}), NestedTable. unnest(NestedTable, Data, DataID) when is_list(Data) -> Fun = fun (Item0) when ?is_nested(Item0) -> ItemID = nm_node:id(), Item1 = unnest(NestedTable, Item0, ItemID), ets:insert_new(NestedTable, {ItemID, DataID, Item1}), nm_node:ref(ItemID); (Item0) -> Item0 end, lists:map(Fun, Data); unnest(NestedTable, Data, DataID) when is_map(Data) -> Fun = fun (_Key, Value0) when ?is_nested(Value0) -> ItemID = nm_node:id(), Value1 = unnest(NestedTable, Value0, ItemID), ets:insert_new(NestedTable, {ItemID, DataID, Value1}), nm_node:ref(ItemID); (_Key, Value0) -> Value0 end, maps:map(Fun, Data).