   IRunnable
   (run [this]
     (let [oldstate state
-          [res derefed] (capture-derefed f)]
+          res (capture-derefed f this)
+          derefed (.-captured this)]
       (when (not= derefed watching)
         (-update-watching this derefed))
       (when-not active?


(defn running [] @-running)

(defn- capture-derefed [f]
  ;; TODO: Get rid of allocation.
  (binding [*ratom-context* (clojure.core/atom #{})]
    [(f) @*ratom-context*]))

(defn- notify-deref-watcher! [derefable]
  (when-not (nil? *ratom-context*)
    (swap! *ratom-context* conj derefable)))

(deftype RAtom [state meta validator watches]
  IEquiv

(defn make-reaction [f & {:keys [auto-run on-set on-dispose]}]
  (let [runner (if (= auto-run true) run auto-run)]
    (Reaction. f nil true false
               nil {}
               runner on-set on-dispose)))
