Packages
ex_cldr
0.12.0
2.47.5
2.47.4
2.47.3
2.47.2
2.47.1
2.47.0
2.46.0
2.45.2
2.45.1
2.45.0
2.44.1
2.44.0
2.43.2
2.43.1
2.43.0
2.42.0
2.41.1
2.41.0
2.40.4
2.40.3
2.40.2
2.40.1
2.40.0
2.39.2
2.39.1
2.39.0
2.38.1
2.38.0
2.37.5
2.37.4
2.37.3
retired
2.37.2
2.37.1
2.37.0
2.36.0
2.35.1
2.35.0
retired
2.34.2
2.34.1
2.34.0
2.33.2
2.33.1
2.33.1-rc.0
2.33.0
2.32.1
2.32.0
2.31.0
2.30.0
2.29.0
2.28.0
2.27.1
2.27.0
retired
2.26.3
2.26.2
2.26.1
2.26.0
2.25.0
2.24.2
2.24.1
2.24.0
2.24.0-rc.6
2.24.0-rc.5
2.24.0-rc.4
2.24.0-rc.3
2.24.0-rc.2
2.24.0-rc.1
2.24.0-rc.0
2.23.2
2.23.1
2.23.0
2.22.1
2.22.0
2.21.0
2.20.0
2.20.0-rc.3
2.20.0-rc.2
2.20.0-rc.1
2.20.0-rc.0
2.19.1
2.19.0
2.18.2
2.18.1
2.18.0
2.18.0-rc.0
2.17.2
2.17.1
2.17.0
2.16.2
2.16.1
2.16.1-rc.0
2.16.0
2.15.0
2.14.1
2.14.0
2.14.0-rc.0
2.13.0
2.12.1
2.12.0
2.11.1
2.11.0
2.10.2
2.10.1
2.10.0
retired
2.9.0
2.8.1
2.8.0
2.7.2
2.7.1
2.7.0
2.6.2
2.6.1
2.6.0
2.5.0
2.4.3
2.4.2
2.4.1
2.4.0
2.3.2
2.3.1
2.3.0
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.0
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.3
retired
2.0.0-rc.2
retired
2.0.0-rc.1
retired
2.0.0-rc.0
retired
1.8.2
1.8.1
1.8.0
1.7.1
1.7.0
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
retired
1.4.0-rc.3
retired
1.4.0-rc.2
retired
1.4.0-rc.1
retired
1.4.0-rc.0
retired
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.0
1.0.0-rc.3
retired
1.0.0-rc.2
retired
1.0.0-rc.1
retired
1.0.0-rc.0
retired
0.13.1
0.13.0
0.12.2
retired
0.12.1
retired
0.12.0
retired
0.11.0
retired
0.10.0
retired
0.9.0
retired
0.8.3
retired
0.8.2
retired
0.8.1
retired
0.8.0
retired
0.7.0
retired
0.6.2
retired
0.6.1
retired
0.6.0
retired
0.5.2
retired
0.5.1
retired
0.5.0
retired
0.4.2
retired
0.4.1
retired
0.4.0
retired
0.3.0
retired
0.2.1
retired
0.2.0
retired
0.1.3
retired
0.1.2
retired
0.1.1
retired
0.1.0
retired
0.0.20
retired
0.0.19
retired
0.0.18
retired
0.0.17
retired
0.0.16
retired
0.0.15
retired
0.0.14
retired
0.0.13
retired
0.0.12
retired
0.0.11
retired
0.0.10
retired
0.0.8
retired
0.0.7
retired
0.0.6
retired
0.0.5
retired
0.0.4
retired
0.0.3
retired
Common Locale Data Repository (CLDR) functions for Elixir to localize and format numbers, dates, lists, messages, languages, territories and units with support for over 700 locales for internationalized (i18n) and localized (L10N) applications.
Retired package: Deprecated
Current section
Files
Jump to
Current section
Files
lib/cldr/helpers/map.ex
defmodule Cldr.Map do
@moduledoc """
Helper functions for transforming maps, keys and values.
"""
@doc """
Convert map string camelCase keys to underscore_keys
"""
def underscore_keys(nil), do: nil
def underscore_keys(map = %{}) do
map
|> Enum.map(fn {k, v} -> {Cldr.String.underscore(k), underscore_keys(v)} end)
|> Enum.map(fn {k, v} -> {String.replace(k, "-", "_"), v} end)
|> Enum.into(%{})
end
# Walk the list and atomize the keys of
# of any map members
def underscore_keys([head | rest]) do
[underscore_keys(head) | underscore_keys(rest)]
end
def underscore_keys(not_a_map) do
not_a_map
end
@doc """
Underscore one key of a map
"""
def underscore_key(map, key) do
Map.put(map, Cldr.String.underscore(key), Map.get(map, key))
|> Map.delete(key)
end
@doc """
Convert map string keys to :atom keys
"""
def atomize_keys(nil), do: nil
# Structs don't do enumerable and anyway the keys are already
# atoms
def atomize_keys(struct = %{__struct__: _}) do
struct
end
def atomize_keys(map = %{}) do
map
|> Enum.map(fn {k, v} -> {atomize_key(k), atomize_keys(v)} end)
|> Enum.into(%{})
end
# Walk the list and atomize the keys of
# of any map members
def atomize_keys([head | rest]) do
[atomize_keys(head) | atomize_keys(rest)]
end
def atomize_keys(not_a_map) do
not_a_map
end
def atomize_key(key) when is_binary(key) do
String.to_atom(key)
end
def atomize_key(key) when is_atom(key) do
key
end
@doc """
Convert map binary values to atoms where possible.
"""
def atomize_values(nil), do: nil
def atomize_values(map = %{}) do
Enum.map(map, fn
{k, v} when is_binary(v) ->
{k, String.to_atom(v)}
{k, v} ->
{k, atomize_values(v)}
end)
|> Enum.into(%{})
end
# Walk the list and atomize the values of
# of any list members
def atomize_values([head | rest]) do
[atomize_values(head) | atomize_values(rest)]
end
def atomize_values(item) when is_binary(item) do
String.to_atom(item)
end
def atomize_values(not_a_map) do
not_a_map
end
@doc """
Convert map atom keys to strings
"""
def stringify_keys(nil), do: nil
def stringify_keys(map = %{}) do
map
|> Enum.map(fn {k, v} -> {Atom.to_string(k), stringify_keys(v)} end)
|> Enum.into(%{})
end
# Walk the list and atomize the keys of
# of any map members
def stringify_keys([head | rest]) do
[stringify_keys(head) | stringify_keys(rest)]
end
def stringify_keys(not_a_map) do
not_a_map
end
@doc """
Convert map atom or binary keys to integers where possible.
"""
def integerize_keys(nil), do: nil
def integerize_keys(map = %{}) do
Enum.map(map, fn
{k, v} when is_atom(k) ->
k2 = Atom.to_string(k)
if Regex.match?(~r/^[0-9]+$/, k2) do
{String.to_integer(k2), integerize_keys(v)}
else
{k, integerize_keys(v)}
end
{k, v} when is_binary(k) ->
if Regex.match?(~r/^[0-9]+$/, k) do
{String.to_integer(k), integerize_keys(v)}
else
{k, integerize_keys(v)}
end
end)
|> Enum.into(%{})
end
# Walk the list and integerize the keys of
# of any map members
def integerize_keys([head | rest]) do
[integerize_keys(head) | integerize_keys(rest)]
end
def integerize_keys(not_a_map) do
not_a_map
end
@doc """
Convert map binary values to integers where possible.
"""
def integerize_values(nil), do: nil
def integerize_values(map = %{}) do
Enum.map(map, fn
{k, v} when is_binary(v) ->
if Regex.match?(~r/^[0-9]+$/, v) do
{k, String.to_integer(v)}
else
{k, integerize_values(v)}
end
{k, v} ->
{k, integerize_values(v)}
end)
|> Enum.into(%{})
end
# Walk the list and integerize the keys of
# of any map members
def integerize_values([head | rest]) do
[integerize_values(head) | integerize_values(rest)]
end
def integerize_values(not_a_map) do
not_a_map
end
@doc """
Convert map binary values to integers where possible.
"""
def floatize_values(nil), do: nil
def floatize_values(map = %{}) do
Enum.map(map, fn
{k, v} when is_binary(v) ->
if Regex.match?(~r/^[0-9]+\.[0-9]+$/, v) do
{k, String.to_float(v)}
else
{k, floatize_values(v)}
end
{k, v} ->
{k, floatize_values(v)}
end)
|> Enum.into(%{})
end
# Walk the list and integerize the keys of
# of any map members
def floatize_values([head | rest]) do
[integerize_values(head) | integerize_values(rest)]
end
def floatize_values(not_a_map) do
not_a_map
end
@doc """
Returns the result of deep merging a list of maps
"""
def merge_map_list([h | []]) do
h
end
def merge_map_list([h | t]) do
deep_merge(h, merge_map_list(t))
end
def merge_map_list([]) do
[]
end
@doc """
Deep merge two maps
"""
def deep_merge(left, right) do
Map.merge(left, right, &deep_resolve/3)
end
# Key exists in both maps, and both values are maps as well.
# These can be merged recursively.
defp deep_resolve(_key, left = %{}, right = %{}) do
deep_merge(left, right)
end
# Key exists in both maps, but at least one of the values is
# NOT a map. We fall back to standard merge behavior, preferring
# the value on the right.
defp deep_resolve(_key, _left, right) do
right
end
@doc """
Delete all members of a map that have a
key in the list of keys
"""
def delete_in(%{} = map, keys) when is_list(keys) do
Enum.reject(map, fn {k, _v} -> k in keys end)
|> Enum.map(fn {k, v} -> {k, delete_in(v, keys)} end)
|> Enum.into(%{})
end
def delete_in(map, keys) when is_list(map) and is_binary(keys) do
delete_in(map, [keys])
end
def delete_in(map, keys) when is_list(map) do
Enum.reject(map, fn {k, _v} -> k in keys end)
|> Enum.map(fn {k, v} -> {k, delete_in(v, keys)} end)
end
def delete_in(%{} = map, keys) when is_binary(keys) do
delete_in(map, [keys])
end
def delete_in(other, _keys) do
other
end
@doc """
Rename map keys
"""
def rename_key(%{} = map, from, to) do
Enum.map(map, fn {k, v} ->
if k == from do
{to, rename_key(v, from, to)}
else
{k, rename_key(v, from, to)}
end
end)
|> Enum.into(%{})
end
def rename_key(other, _from, _to) do
other
end
@doc """
Remove any leading underscores from map keys
"""
def remove_leading_underscores(%{} = map) do
Enum.map(map, fn {k, v} ->
{String.replace_prefix(k, "_", ""), remove_leading_underscores(v)} end)
|> Enum.into(%{})
end
def remove_leading_underscores(v) do
v
end
def from_keyword(keyword) do
Enum.into(keyword, %{})
end
@doc """
Execute a function over each element of a nested map
"""
def deep_map(nil), do: nil
def deep_map(map = %{}, fun) do
Enum.map(map, fn
{k, v} when is_map(v) ->
{k, deep_map(v, fun)}
{_k, _v} = entry ->
fun.(entry)
end)
|> Enum.into(%{})
end
end