Hi Renata,

```
user=> (clojure.pprint/pprint (swap! accounts #(map (fn [a] (if (= (:id a)
"3136860d-ab7f-4814-8f3b-2d18048db9b9") (assoc a :operations :foo) a)) %)))
({:id "7512a15b-0770-4a9b-a74b-389374b46461",
  :balance 0.0,
  :operations nil,
  :blocked false}
 {:id "7446cfe6-882c-4f25-bad1-5ed8c9aea994",
  :balance 0.0,
  :operations nil,
  :blocked false}
 {:id "3136860d-ab7f-4814-8f3b-2d18048db9b9",
  :balance 0.0,
  :operations :foo,
  :blocked false}
 {:id "2dc20615-f1f7-4637-9602-ae9494689166",
  :balance 0.0,
  :operations nil,
  :blocked false}
 {:id "c6dccf4a-535c-4eba-8cfc-0554408de8bd",
  :balance 0.0,
  :operations nil,
  :blocked false})
```

Your swapping function will have to be map since you're trying to update
some matching component of a vector. Then you can test if the current item
is your target `(if (= (:id a) …)` at which point you can change it `(assoc
a :operations …)`. Otherwise, you need to return it so you don't lose any
data.

Note that in this case it might make some sense to transform your data to a
map since that allows for simple key lookups and would allow for the use of
`assoc-in`:

```
user=> (clojure.pprint/pprint @accounts)
{"7512a15b-0770-4a9b-a74b-389374b46461"
 {:id "7512a15b-0770-4a9b-a74b-389374b46461",
  :balance 0.0,
  :operations nil,
  :blocked false},
 "7446cfe6-882c-4f25-bad1-5ed8c9aea994"
 {:id "7446cfe6-882c-4f25-bad1-5ed8c9aea994",
  :balance 0.0,
  :operations nil,
  :blocked false},
 "3136860d-ab7f-4814-8f3b-2d18048db9b9"
 {:id "3136860d-ab7f-4814-8f3b-2d18048db9b9",
  :balance 0.0,
  :operations nil,
  :blocked false},
 "2dc20615-f1f7-4637-9602-ae9494689166"
 {:id "2dc20615-f1f7-4637-9602-ae9494689166",
  :balance 0.0,
  :operations nil,
  :blocked false},
 "c6dccf4a-535c-4eba-8cfc-0554408de8bd"
 {:id "c6dccf4a-535c-4eba-8cfc-0554408de8bd",
  :balance 0.0,
  :operations nil,
  :blocked false}}
nil
user=> (clojure.pprint/pprint (swap! accounts #(assoc-in %
["3136860d-ab7f-4814-8f3b-2d18048db9b9" :operations] :bar)))
{"7512a15b-0770-4a9b-a74b-389374b46461"
 {:id "7512a15b-0770-4a9b-a74b-389374b46461",
  :balance 0.0,
  :operations nil,
  :blocked false},
 "7446cfe6-882c-4f25-bad1-5ed8c9aea994"
 {:id "7446cfe6-882c-4f25-bad1-5ed8c9aea994",
  :balance 0.0,
  :operations nil,
  :blocked false},
 "3136860d-ab7f-4814-8f3b-2d18048db9b9"
 {:id "3136860d-ab7f-4814-8f3b-2d18048db9b9",
  :balance 0.0,
  :operations :bar,
  :blocked false},
 "2dc20615-f1f7-4637-9602-ae9494689166"
 {:id "2dc20615-f1f7-4637-9602-ae9494689166",
  :balance 0.0,
  :operations nil,
  :blocked false},
 "c6dccf4a-535c-4eba-8cfc-0554408de8bd"
 {:id "c6dccf4a-535c-4eba-8cfc-0554408de8bd",
  :balance 0.0,
  :operations nil,
  :blocked false}}
```


On Sun, Apr 29, 2018 at 10:12 AM, Axel Katerbau <akater...@gmail.com> wrote:

> Hi Renata,
>
> > How can I update the atom accounts in the field of operations?
> >
> > (def accounts (atom [{:id "7512a15b-0770-4a9b-a74b-389374b46461",
> :balance 0.0, :operations nil, :blocked false}
> >   {:id "7446cfe6-882c-4f25-bad1-5ed8c9aea994", :balance 0.0,
> :operations nil, :blocked false}
> >   {:id "3136860d-ab7f-4814-8f3b-2d18048db9b9", :balance 0.0,
> :operations nil, :blocked false}
> >   {:id "2dc20615-f1f7-4637-9602-ae9494689166", :balance 0.0,
> :operations nil, :blocked false}
> >   {:id "c6dccf4a-535c-4eba-8cfc-0554408de8bd", :balance 0.0,
> :operations nil, :blocked false}]))
> >
> > I tried this:
> >
> > (swap! accounts (fn [x] (update-in x [:operations]  #(if (= (:id %)
> account-id) new-value))))
> >
> > and returns "key must be integer" because of [:operations]
>
> the atom hold and array of accounts. In swap! you are trying to access one
> (!) value in a key-path [:operations] but access to elements of an array is
> not valid via a key-path but by using indexes.
>
> What you are seemingly trying to do is to map over the contents of the
> array in the atom which is not what you coded here.
>
> - Axel
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to