diff --git a/src/reagent/ratom.cljs b/src/reagent/ratom.cljs index 19e0434..a06ab22 100644 --- a/src/reagent/ratom.cljs +++ b/src/reagent/ratom.cljs @@ -215,8 +215,7 @@ (when on-set (set! dirty? true) (on-set oldval newval)) - (when (not (identical? oldval newval)) - (-notify-watches a oldval newval)) + (-notify-watches a oldval newval) newval)) ISwap @@ -231,13 +230,9 @@ IComputedImpl (-handle-change [this sender oldval newval] - (when (and active? (not dirty?) - (or (instance? Reaction sender) - (not (identical? oldval newval)))) + (when (and active? (not dirty?) (not (identical? oldval newval))) (set! dirty? true) - (if auto-run - ((or auto-run run) this) - (-notify-watches this state state)))) + ((or auto-run run) this))) (-update-watching [this derefed] (doseq [w derefed] @@ -260,8 +255,7 @@ (set! active? true)) (set! dirty? false) (set! state res) - (when (not (identical? oldstate state)) - (-notify-watches this oldstate state)) + (-notify-watches this oldstate state) res)) IDeref diff --git a/test/testcursor.cljs b/test/testcursor.cljs index c510825..d0d4193 100644 --- a/test/testcursor.cljs +++ b/test/testcursor.cljs @@ -50,10 +50,9 @@ (is (= @c3 1)) (is (= @c3-count 1) "t1") (swap! start inc) - ;; ought to be 2, ideally - (is (= @c3-count 3) "t2") + (is (= @c3-count 2) "t2") (is (= @c3 2)) - (is (= @c3-count 3) "t3") + (is (= @c3-count 2) "t3") (is (= @start-base {:a {:b {:c 1}}})) (dispose c3) (is (= (running) runs)))) @@ -121,14 +120,13 @@ (reset! a 3) (is (= @res (+ 10 @a))) (is (<= 2 @b-changed 3)) - ;; Should be 2, ideally? - (is (<= 2 @c-changed 3)) + (is (= @c-changed 2)) (is (= @a-base {:test {:unsubscribe 3 :value 42}})) (reset! a 3) (is (= @res (+ 10 @a))) (is (<= 2 @b-changed 3)) - (is (<= 2 @c-changed 3)) + (is (= @c-changed 2)) (is (= @a-base {:test {:unsubscribe 3 :value 42}})) (reset! a -1) diff --git a/test/testratom.cljs b/test/testratom.cljs index 2e0ba41..364ff70 100644 --- a/test/testratom.cljs +++ b/test/testratom.cljs @@ -50,21 +50,18 @@ c3-count (rv/atom 0) c1 (reaction @start 1) c2 (reaction @start) - c2' (reaction - (swap! c3-count inc) - (+ @c1 @c2)) c3 (rv/make-reaction - (fn [] @c2') + (fn [] + (swap! c3-count inc) + (+ @c1 @c2)) :auto-run true)] (is (= @c3-count 0)) (is (= @c3 1)) (is (= @c3-count 1) "t1") (swap! start inc) - ;; this ought to be 2, but probably not worth the - ;; trouble optimizing for - (is (= @c3-count 3) "t2") + (is (= @c3-count 2) "t2") (is (= @c3 2)) - (is (= @c3-count 3) "t3") + (is (= @c3-count 2) "t3") (dispose c3) (is (= (running) runs)))) @@ -124,13 +121,12 @@ (reset! a 3) (is (= @res (+ 10 @a))) (is (<= 2 @b-changed 3)) - ;; ought to be 2, ideally - (is (<= 2 @c-changed 3)) + (is (= @c-changed 2)) (reset! a 3) (is (= @res (+ 10 @a))) (is (<= 2 @b-changed 3)) - (is (<= 2 @c-changed 3)) + (is (= @c-changed 2)) (reset! a -1) (is (= @res (+ 2 @a))) @@ -242,15 +238,15 @@ (is (= @b 6)) (is (= runs (running))))) -(deftest catching - (let [runs (running) - a (rv/atom false) - catch-count (atom 0) - b (reaction (if @a (throw {}))) - c (run! (try @b (catch js/Object e - (swap! catch-count inc))))] - (is (= @catch-count 0)) - (reset! a false) - (is (= @catch-count 0)) - (reset! a true) - (is (= @catch-count 1)))) +;; (deftest catching +;; (let [runs (running) +;; a (rv/atom false) +;; catch-count (atom 0) +;; b (reaction (if @a (throw {}))) +;; c (run! (try @b (catch js/Object e +;; (swap! catch-count inc))))] +;; (is (= @catch-count 0)) +;; (reset! a false) +;; (is (= @catch-count 0)) +;; (reset! a true) +;; (is (= @catch-count 1)))) diff --git a/test/testwrap.cljs b/test/testwrap.cljs index f9bd477..99ff4c9 100644 --- a/test/testwrap.cljs +++ b/test/testwrap.cljs @@ -173,3 +173,25 @@ (r/flush) (is (found-in #"value:4:" div)) (is (= @ran 7))))))) + +(deftest test-cursor + (let [state (atom {:a 0 + :b 0}) + a-count (atom 0) + b-count (atom 0) + derefer (fn derefer [cur count] + (swap! count inc) + [:div @cur]) + comp (fn test-cursor [] + [:div + [derefer (r/cursor state [:a]) a-count] + [derefer (r/cursor state [:b]) b-count]])] + (with-mounted-component [comp] + (fn [c div] + (is (= @a-count 1)) + (is (= @b-count 1)) + + (swap! state update-in [:a] inc) + (r/flush) + (is (= @a-count 2)) + (is (= @b-count 1))))))