Back in February I wrote about how to work with deeply nested
maps. One missing piece was the ability to easily prune data
from a deeply nested map. Today I’d like to introduce you to
Kernel.pop_in
which will be available in Elixir 1.3.
Given the following:
my_map = %{
foo: %{
bar: %{
baz: "my value"
}
}
}
In order to delete the baz
atom you would have to write something like
this:
put_in(my_map, [:foo, :bar], %{})
For this contrite example it may not seem that bad. But let’s take a look at another example:
my_map = %{
foo: %{
bar: %{
baz: "my value",
qux: "other value"
}
}
}
If we wanted to preserve the qux
atom we’d write:
put_in(my_map, [:foo, :bar], Map.delete(my_map[:foo][:bar], :baz))
Now we’re starting to see something that could get ugly. This is where
Kernel.pop_in
can help:
pop_in(my_map, [:foo, :bar, :baz])
That’s nice and clean! However, unlike the other accessor-based functions this one returns a tuple:
{"my value", %{foo: %{bar: %{qux: "other value"}}}} = pop_in(my_map, [:foo, :bar, :baz])
The first element in the tuple will be the value that is being removed. The second element will be the new map.
Elixir 1.3 comes packed with a bunch of improvements for the developer experience like this one. Hopefully we can all start enjoying it soon!