Working with Nested structures

Another option is to use Kernel.update_in/3 which is intended to help with updating nested structures.

This will give you something to play with:

iex(1)> all = fn :get_and_update, data, next -> data |> Enum.map(next) |> Enum.unzip() end                                        
#Function<42.97283095/3 in :erl_eval.expr/5>
iex(2)> complete_item = fn list, id -> update_in(list, [:tasks, all], fn %{id: ^id} = t -> %{t | completed: true}; t -> t end) end
#Function<43.97283095/2 in :erl_eval.expr/5>
iex(3)> list = %{
...(3)>   tasks: [
...(3)>     %{completed: false, date_added: "3.18.2021", id: 1, name: "walk the dog"},
...(3)>     %{completed: false, date_added: "3.18.2021", id: 2, name: "cook dinner"},
...(3)>     %{completed: false, date_added: "3.18.2021", id: 3, name: "laundry"}
...(3)>   ]
...(3)> }
%{
  tasks: [
    %{completed: false, date_added: "3.18.2021", id: 1, name: "walk the dog"},
    %{completed: false, date_added: "3.18.2021", id: 2, name: "cook dinner"},
    %{completed: false, date_added: "3.18.2021", id: 3, name: "laundry"}
  ]
}
iex(4)> complete_item.(list, 2)
%{
  tasks: [
    %{completed: false, date_added: "3.18.2021", id: 1, name: "walk the dog"},
    %{completed: true, date_added: "3.18.2021", id: 2, name: "cook dinner"},
    %{completed: false, date_added: "3.18.2021", id: 3, name: "laundry"}
  ]
}