Packages
moar
0.1.0
5.0.0
4.3.0
4.2.0
4.1.0
4.0.0
3.2.0
3.1.0
3.0.0
2.7.0
2.6.0
2.5.0
2.4.2
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.1
2.0.0
1.64.0
1.63.1
1.63.0
1.62.0
1.61.2
1.61.1
1.61.0
1.60.0
1.59.2
1.59.1
1.59.0
1.58.0
1.57.0
1.56.2
1.56.1
1.56.0
1.55.0
1.54.0
1.53.0
1.52.1
1.52.0
1.51.0
1.50.0
1.49.0
1.48.0
1.47.0
1.46.0
1.45.1
1.45.0
1.44.0
1.43.0
1.42.0
1.41.0
1.40.0
1.39.0
1.38.0
1.37.0
1.36.0
1.35.0
1.34.0
1.33.0
1.32.0
1.31.0
1.30.0
1.29.0
1.28.0
1.27.0
1.26.0
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.0
1.19.3
1.19.2
1.19.1
1.19.0
1.18.1
1.18.0
1.17.0
1.16.0
1.15.0
1.14.0
1.13.1
1.13.0
1.12.0
1.11.0
1.10.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.0
1.4.0
1.3.0
1.2.0
1.1.0
1.0.0
0.1.0
A dependency-free utility library containing 100+ useful functions.
Current section
Files
Jump to
Current section
Files
lib/map.ex
defmodule Moar.Map do
# @related [test](/test/map_test.exs)
@moduledoc "Map-related functions"
@doc "Convert keys in `map` to atoms"
@spec atomize_keys(map()) :: map()
def atomize_keys(map),
do: map |> Map.new(fn {k, v} -> {Moar.Atom.from_string(k), v} end)
@doc "Convert keys to atoms, traversing through descendant lists and maps"
@spec deep_atomize_keys(list() | map()) :: map()
def deep_atomize_keys(list) when is_list(list),
do: list |> Enum.map(&deep_atomize_keys(&1))
def deep_atomize_keys(map) when is_map(map) do
Map.new(map, fn
{k, v} when is_map(v) -> {Moar.Atom.from_string(k), deep_atomize_keys(v)}
{k, list} when is_list(list) -> {Moar.Atom.from_string(k), Enum.map(list, fn v -> deep_atomize_keys(v) end)}
{k, v} -> {Moar.Atom.from_string(k), v}
end)
end
def deep_atomize_keys(not_a_map),
do: not_a_map
@doc "Merge two enumerables into a single map"
@spec merge(Enum.t(), Enum.t()) :: map()
def merge(a, b) when is_map(a) and is_map(b),
do: Map.merge(a, b)
def merge(a, b),
do: Map.merge(Enum.into(a, %{}), Enum.into(b, %{}))
@doc "Return a copy of `map` with `old_key_name` changed to `new_key_name`"
@spec rename_key(map(), binary() | atom(), binary() | atom()) :: map()
def rename_key(map, old_key_name, new_key_name) when is_map_key(map, old_key_name) do
{value, new_map} = Map.pop(map, old_key_name)
Map.put(new_map, new_key_name, value)
end
def rename_key(map, _, _),
do: map
def rename_key(map, {old_key, new_key}),
do: rename_key(map, old_key, new_key)
def rename_keys(map, keys_map),
do: Enum.reduce(keys_map, map, &rename_key(&2, &1))
@doc "Convert keys in `map` to strings"
@spec stringify_keys(map()) :: map()
def stringify_keys(map),
do: map |> Map.new(fn {k, v} -> {Moar.Atom.to_string(k), v} end)
@doc "Transform values of `map` using `transformer` function"
@spec transform(map(), atom() | binary() | list(), (any() -> any())) :: map()
def transform(map, key, transformer) when is_binary(key) and is_map_key(map, key),
do: Map.update!(map, key, transformer)
def transform(map, keys, transformer) when is_list(keys),
do: Enum.reduce(keys, map, fn key, new_map -> transform(new_map, key, transformer) end)
def transform(map, _, _),
do: map
end