使用交换!而不是重置!在原子 - clojure

时间:2018-03-30 16:29:04

标签: clojure

鉴于我要执行此操作

(def structure (atom [{:id "an-id"} {:id "another-id"}]))
(def job {:type "some-job"})

(reset! structure (map #(if (= "an-id" (:id %)) (update-in % [:performed-jobs] (fnil conj []) job) %) @structure))

next structure:
[{:id "an-id" :performed-jobs [{:type "some-job"}]} {:id "another-id"}]

我如何使用swap!更改我的结构中的单个事件而不是全部重置?

1 个答案:

答案 0 :(得分:1)

  1. reset!替换为swap!,为其提供一个获取atom旧值的函数,并返回一个新值以存储在atom中。
  2. atom的解除引用替换为函数的参数,即旧值。

    (swap! structure
      (fn [old]
        (map #(if (= "an-id" (:id %))
                (update-in % [:performed-jobs]
                           (fnil conj []) job) %)
              old)))