Packages
absinthe_utils
0.1.0
0.3.0
0.2.0-1
0.1.0
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1-main-fc1bcd7a9a3344c3b816f69996b44e81c7df841e
0.0.1-main-f3f7019eeb29e81e58b52a1904179d5651d5ce47
0.0.1-main-da68e7b37af94f1d1ff6ba949de0bbc71944a428
0.0.1-main-d5a2fe6243598a29dec4ddb349d351661463aec6
0.0.1-main-d255e08b6c32fe6449757ed94e6abba8bb9a31e7
0.0.1-main-b324c3236f3971cfc05577e796dca31477a46391
0.0.1-main-96f126a7c33a43fc8af80891c168df27cb6fe738
0.0.1-main-8a629d261d43f2b462d4b7e6bbd32fee4871d54b
0.0.1-main-72f3aaa55e5beeeb85467282d2d97db0eb3f4f43
0.0.1-main-6cbd7212b9c6abb25241183c5764ec6b58af0cfd
0.0.1-main-413ca15b56c2636667dc5f1b7898f81da11032b0
0.0.1-main-2bcf8f0401b45d43a9c4592f2311f2e2cfd9309c
0.0.1-main-02ce6a58b060743c268bd76061f9b1ef0d90354a
0.0.1-development
Collection of utils for absinthe
Current section
Files
Jump to
Current section
Files
lib/internal/map_helpers.ex
defmodule AbsintheUtils.Internal.MapHelpers do
@moduledoc """
Helper for nested map manipulations.
"""
@doc """
Pop a key from a nested map, if successful returns a tuple of:
- the popped value
- the modified map, without the popped key
OR if the key is not found, returns :error
## Examples
iex> MapHelpers.safe_pop_in(%{a: 1}, [:a])
{1, %{}}
iex> MapHelpers.safe_pop_in(%{a: 1}, :a)
{1, %{}}
iex> MapHelpers.safe_pop_in(%{a: 1}, [:invalid])
:error
iex> MapHelpers.safe_pop_in(%{a: %{b: 1}}, [:a, :b])
{1, %{a: %{}}}
iex> MapHelpers.safe_pop_in(%{a: %{b: 1}}, [:a, :invalid])
:error
iex> MapHelpers.safe_pop_in(%{}, [:a])
:error
iex> MapHelpers.safe_pop_in(%{a: 1}, [])
:error
iex> MapHelpers.safe_pop_in(%{a: 1}, [:a, :b, :c])
:error
iex> MapHelpers.safe_pop_in(%{a: 1, b: %{c: 2}}, [:b])
{%{c: 2}, %{a: 1}}
iex> MapHelpers.safe_pop_in(%{"a" => 1}, ["a"])
{1, %{}}
"""
def safe_pop_in(map, [last_key]) do
safe_pop_in(map, last_key)
end
def safe_pop_in(map, [key | rest]) when is_map(map) do
case Map.fetch(map, key) do
{:ok, value} ->
case safe_pop_in(value, rest) do
{popped_value, new_value} ->
{popped_value, Map.put(map, key, new_value)}
:error ->
:error
end
:error ->
:error
end
end
def safe_pop_in(map, last_key) when is_map_key(map, last_key) do
Map.pop(map, last_key)
end
def safe_pop_in(_, _) do
:error
end
@doc """
Put a value in a tested map, if any of the keys in the keys_path are not found,
they will be recursively created.
## Examples
iex> MapHelpers.recursive_put_in(%{a: 1}, [:b], 2)
%{a: 1, b: 2}
iex> MapHelpers.recursive_put_in(%{}, [:a], 1)
%{a: 1}
iex> MapHelpers.recursive_put_in(%{}, :a, 1)
%{a: 1}
"""
def recursive_put_in(map, keys_path, _value) when not is_map(map) do
raise ArgumentError,
"Cannot put value recursively #{inspect(keys_path)} into: #{inspect(map)}"
end
def recursive_put_in(map, keys_path, value) when is_atom(keys_path) do
recursive_put_in(map, [keys_path], value)
end
def recursive_put_in(map, [key], value) do
Map.put(map, key, value)
end
def recursive_put_in(map, [key | rest], value) do
current_value = Map.get(map, key, %{})
updated_value = recursive_put_in(current_value, rest, value)
Map.put(map, key, updated_value)
end
end