Packages

Elixir utils.

Retired package: Deprecated - Use instead antl_utils_* packages

Current section

Files

Jump to
antl_utils lib elixir map.ex
Raw

lib/elixir/map.ex

defmodule AntlUtils.Elixir.Map do
@moduledoc false
@doc """
Populate a nested map or a nested list of map with the parent_key's value
Returns a new map with the value populated
## Examples
iex> %{key: "value", child: %{}} |> AntlUtils.Elixir.Map.populate_child(:key, :child)
%{key: "value", child: %{key: "value"}}
iex> %{key: "value", child: %{key: "old_value"}} |> AntlUtils.Elixir.Map.populate_child(:key, :child)
%{key: "value", child: %{key: "value"}}
iex> %{key: "value", child: [%{}, %{}]} |> AntlUtils.Elixir.Map.populate_child(:key, :child)
%{key: "value", child: [%{key: "value"}, %{key: "value"}]}
iex> %{key: "value", child: %{}} |> AntlUtils.Elixir.Map.populate_child(:not_existing_key, :child)
%{key: "value", child: %{not_existing_key: nil}}
iex> %{key: "value", child: %{}} |> AntlUtils.Elixir.Map.populate_child(:key, :not_existing_child)
%{key: "value", child: %{}}
"""
def populate_child(map, parent_key, child_key) when is_map(map) do
value = Map.get(map, parent_key)
Map.new(map, fn
{^child_key, child} when is_list(child) ->
{child_key, Enum.map(child, &put_in(&1, [parent_key], value))}
{^child_key, child} when is_map(child) ->
{child_key, put_in(child, [parent_key], value)}
x ->
x
end)
end
end