           (.rawDeref this)
           (set! (.-dirty this) false))))
     (clean [this]
-      (when-let [clean-fn (.-clean-fn this)]
-        (set! (.-dirty this) true)
-        (clean-fn)))
+      (when (identical? 0 watches)
+        (when-let [clean-fn (.-clean-fn this)]
+          (set! (.-dirty this) true)
+          (clean-fn))))
     (updateChild [this key f args]
       (set! (.-change-ks this) [key])
       (apply swap-fn update key f args)

                           nil nil #js {} 0 nil)
              activate-fn (fn [] (set! child-cursors (update child-cursors ckey conj cur)))]
          (activate-fn)
          (set! (.-active-fn cur) activate-fn)
          (set! (.-clean-fn cur)
                (fn []
                  (set! child-cursors

      (when (contains? watches key)
        (set! (.-watchers this) (dec watchers))
        (set! (.-watches this) (dissoc watches key))
        (.clean this))
      this)

    IKeysetCursor
