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"}
]
}






















