Threadsafe access to a key-value map. Unlike atoms and swap! your update/initialization functions are never ran in parallel which helps if, for instance, initialization is a long running, memory intensive operation there will only be one running even if multiple threads request a value simultaneously.
user> (require '[tech.v3.datatype.locker :as locker]) nil user> (locker/update! ::latest (fn [k v] (println (format "k is %s v is %s" k v)) ::updated)) k is :user/latest v is null :user/updated user> (locker/update! ::latest (fn [k v] (println (format "k is %s v is %s" k v)) ::updated)) k is :user/latest v is :user/updated :user/updated
(compute-if-absent! key init-fn)
Compute a new value if non exists for this key. Key cannot be nil. init-fn will only ever be called once and is passed the key as its first argument.
(compute-if-present! key update-fn)
Compute a new value if one already exists for this key. Key cannot be nil. update-fn is passed the key and the preexisting value.
Remove a key - returns the value if any that existed in that location.
(update! key update-fn)
Update a value. update-fn gets passed the key and the value already present (if any).
(value key missing-value)