Packages
step_flow
1.8.2
1.9.0-rc2
1.9.0-rc1
1.9.0-rc0
1.8.2
1.8.1
1.8.1-rc8
1.8.1-rc7
1.8.1-rc6
1.8.1-rc5
1.8.1-rc4
1.8.1-rc3
1.8.1-rc2
1.8.1-rc1
1.8.1-rc0
1.8.0
1.8.0-rc3
1.8.0-rc2
1.8.0-rc1
1.8.0-rc0
1.7.3
1.7.3-rc4
1.7.3-rc3
1.7.3-rc2
1.7.3-rc1
1.7.3-rc0
1.7.2
1.7.2-rc4
1.7.2-rc3
1.7.2-rc2
1.7.2-rc1
1.7.2-rc0
1.7.1
1.7.0
1.7.0-rc1
1.7.0-rc0
1.6.1
1.6.1-rc1
1.6.1-rc0
1.6.0
1.6.0-rc9
1.6.0-rc8
1.6.0-rc7
1.6.0-rc6
1.6.0-rc5
1.6.0-rc4
1.6.0-rc3
1.6.0-rc20
1.6.0-rc2
1.6.0-rc19
1.6.0-rc18
1.6.0-rc17
1.6.0-rc16
1.6.0-rc15
1.6.0-rc14
1.6.0-rc13
1.6.0-rc12
1.6.0-rc11
1.6.0-rc10
1.6.0-rc1
1.5.0
1.5.0-rc1
1.4.2-rc2
1.4.2-rc1
1.4.1
1.4.1-rc1
1.4.0
1.4.0-rc4
1.4.0-rc3
1.4.0-rc2
1.4.0-rc1
1.3.1
1.3.0
1.3.0-rc
1.2.0
1.1.0
1.0.0
1.0.0-rc9
1.0.0-rc8
1.0.0-rc7
1.0.0-rc6
1.0.0-rc5
1.0.0-rc1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
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.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.4
0.0.3
0.0.2
0.0.1
Step flow manager for Elixir applications
Current section
Files
Jump to
Current section
Files
lib/step_flow/map_tool.ex
defmodule StepFlow.Map do
@moduledoc """
Extend Map with some additional functions.
"""
@doc """
Get a key matching on an atom or a string.
Default value can be specified.
## Examples
iex> StepFlow.Map.get_by_key_or_atom(%{key: "value"}, :key)
"value"
iex> StepFlow.Map.get_by_key_or_atom(%{"key" => "value"}, :key)
"value"
iex> StepFlow.Map.get_by_key_or_atom(%{key: "value"}, "key")
"value"
iex> StepFlow.Map.get_by_key_or_atom(%{"key" => "value"}, "key")
"value"
"""
def get_by_key_or_atom(dict, atom, default \\ nil)
def get_by_key_or_atom(dict, atom, default) when is_atom(atom) do
Map.get_lazy(dict, atom, fn -> Map.get(dict, Atom.to_string(atom), default) end)
end
def get_by_key_or_atom(dict, string, default) when is_bitstring(string) do
Map.get_lazy(dict, string, fn -> Map.get(dict, String.to_atom(string), default) end)
end
def get_by_key_or_atom(_, _, _) do
raise "Got unsupported key type instead of expected Atom or String."
end
@doc """
Replace an item in a map, with atom or string keys.
## Examples
iex> StepFlow.Map.replace_by_atom(%{key: "value"}, :key, "replaced_value")
%{key: "replaced_value"}
iex> StepFlow.Map.replace_by_atom(%{"key" => "value"}, :key, "replaced_value")
%{key: "replaced_value"}
iex> StepFlow.Map.replace_by_atom(%{"key" => "value"}, "key", "replaced_value")
%{key: "replaced_value"}
"""
def replace_by_atom(dict, atom, value) when is_atom(atom) do
dict
|> Map.delete(Atom.to_string(atom))
|> Map.delete(atom)
|> Map.put(atom, value)
end
def replace_by_atom(dict, string, value) when is_bitstring(string) do
dict
|> Map.delete(String.to_atom(string))
|> Map.delete(string)
|> Map.put(String.to_atom(string), value)
end
def replace_by_atom(_dict, _atom, _value) do
raise "Got unsupported key type instead of expected Atom or String."
end
def replace_by_string(dict, string, value) when is_bitstring(string) do
dict
|> Map.delete(String.to_atom(string))
|> Map.delete(string)
|> Map.put(string, value)
end
def replace_by_string(_dict, _string, _value) do
raise "Got unsupported 2nd argument type, expected String."
end
end