Current section
Files
Jump to
Current section
Files
src/nm_nesting.erl
-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).