Naive solution on a first try:
defmodule IntMapSanitizer do
@test_map_1 %{
greet: "Hirrow",
int_a: "17",
int_b: "gibberish",
int_c: "428",
farewell: "Aufwiedersehen"
}
defp is_int_name?(k) when is_atom(k) do
k
|> Atom.to_string()
|> String.starts_with?("int_")
end
defp should_keep?(v) when is_nil(v) or is_integer(v), do: false
defp should_keep?(_), do: true
defp parse_to_int_or_nil(v) do
case Integer.parse(v) do
:error ->
nil
{parsed, _} ->
parsed
end
end
def sanitize(%{} = map) do
for {k, v} <- map, is_int_name?(k), should_keep?(v), reduce: map do
acc -> Map.update(acc, k, nil, &parse_to_int_or_nil(&1))
end
end
def test1() do
sanitize(@test_map_1)
end
end
Try in iex:
iex(1)> IntMapSanitizer.test1()
%{
farewell: "Aufwiedersehen",
greet: "Hirrow",
int_a: 17,
int_b: nil,
int_c: 428
}
Haven’t measured but for comprehensions with filters and the reduce option have always been fairly fast in my experience.
Maybe if you make a public GitHub repo then we can make a benchmarking arena. ![]()






















