Hi,

I'm a frequent user of the Access module, and I'm excited about the recent 
addition of Access.find/1 to support some use-cases I've had to work my way 
around in the past. However, now that I have it, the first thing I wanted to do 
actually applied to a map.

For context, I'm working with Ecto changesets in a Phoenix LiveView 
application. I'm working with a `Foo` schema that has an assoc containing a 
number of uploaded files. Whenever I edit a Foo, I want to be able to upload a 
new file, but only one at a time. I also want to be able to edit the attached 
descriptions to each of the files that are already uploaded. I have written 
some logic that only shows one live_file_input at a time, and I have written 
the following `save` function (following the pattern in the standard 
phx.gen.live templates):

```elixir
  defp save(socket, :edit, foo_params) do
    uploaded_entries_params = consume_uploaded_entries(socket, :file, 
&upload_consumer/2)

    foo_params =
      case uploaded_entries_params do
        [] ->
          foo_params

        [upload_params] ->
          update_in(
            foo_params,
            ["foo_files", Access.find(&is_nil(&1["file_id"])), "file"],
            &Map.merge(&1, upload_params)
          )
      end

    case Foos.update_foo(socket.assigns.foo, foo_params) do
      {:ok, foo} ->
        {:noreply, push_patch(socket, to: socket.assigns.patch)}

      {:error, %Ecto.Changeset{} = changeset} ->
        {:noreply, assign_form(socket, changeset)}
    end
  end
```

The interesting bit is the `update_in` call, which takes the params generated 
by my `upload_consumer` and merges it with the params coming from the form 
submission. Unfortunately, this doesn't work, since `foo_params["foo_files"]` 
is a map of the form: `%{"0" => %{ ... }, ...}`

I was a bit surprised to find that Access.find/1 doesn't work with maps, but 
then I remembered that the same is true for Access.filter/1. My (very) cursory 
look at the implementation suggests that both of those are using 
Enum-functions, which _do_ in fact support maps, so I am wondering why that is 
not the case for the Access-functions? Would there be any interest in adding 
support for maps in Access.find/1 and Access.filter/1?

Best regards
Philip

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/d29a0d69-db72-4d2d-814e-5809c4f8da6f%40app.fastmail.com.

Reply via email to