       dat
       (recur f dat'))))
 
-
 (defn update
   "λ {A → B} → A → (λ B → args* → C) → args* → {A → C}
 

          (for [[k v] m]
            (map-entry (apply f k args) v)))))


(defn map-vals-with-keys
  "Create a new map from m by calling function f, with two
  arguments (the key and value) to get a new value."

    (apply f x args)
    x))

(defn ->>when-update
  "Function of a predicate, an updater, optional varargs and a
  value. If the predicate is true of the value, returns (apply f x
