Dustin Getz / Sep 20 2022 / Published
photon reactive tree diffing
{:deps {compliment/compliment {:mvn/version "0.3.9"} org.clojure/clojure {:mvn/version "1.11.1"} com.hyperfiddle/photon {:mvn/version "20220827-153507"} com.hyperfiddle/rcf {:mvn/version "20220902-130636"} missionary/missionary {:mvn/version "b.27-SNAPSHOT"}}}Extensible Data Notation
(require [hyperfiddle.photon :as p] [hyperfiddle.rcf :as rcf :refer [tests ! % with]] [missionary.core :as m])(hyperfiddle.rcf/enable!)16.8s
(tests (def !order (atom {:account/email "alice@example.com" :order/items [{:item/sku 100 :order/count 2}]})) (def dispose (p/run (let [order (p/watch !order) {:keys [account/email order/items]} order] (println "email: " (! email)) (println "item count: " (! (count items))) (p/for-by :item/sku [{:keys [item/sku order/count]} items] (println "sku: " (! sku)) (println "sku count: " (! count)))))) "touch everything first time" % := "alice@example.com" ; email % := 1 ; item count % := 100 ; sku % := 2 ; sku count "point write" (swap! !order update-in [:order/items 0 :order/count] inc) % := 3 ; sku count "add another record, only touch what changed" (swap! !order update-in [:order/items] conj {:item/sku 101 :order/count 1}) % := 2 ; item count % := 101 ; sku % := 1 ; sku count % := ::rcf/timeout ; assert no more came (dispose))2.0s