diff --git a/deps.edn b/deps.edn index 77d11a04..2fffb37c 100644 --- a/deps.edn +++ b/deps.edn @@ -3,7 +3,7 @@ com.cognitect/transit-cljs {:mvn/version "0.8.280"} com.hyperfiddle/hyperfiddle-contrib {:mvn/version "v0-alpha-SNAPSHOT"} com.hyperfiddle/rcf {:mvn/version "20220926-202227"} - missionary/missionary {:mvn/version "b.43"} + missionary/missionary {:mvn/version "b.44"} fipp/fipp {:mvn/version "0.6.26"} org.clojure/clojure {:mvn/version "1.12.0-alpha11"} org.clojure/clojurescript {:mvn/version "1.11.121"} diff --git a/src/hyperfiddle/electric/impl/runtime3.cljc b/src/hyperfiddle/electric/impl/runtime3.cljc index 2747c1cc..c37e248c 100644 --- a/src/hyperfiddle/electric/impl/runtime3.cljc +++ b/src/hyperfiddle/electric/impl/runtime3.cljc @@ -1540,26 +1540,24 @@ T T T -> (EXPR T) (when-some [^objects channel (aget remote remote-slot-channel)] (channel-output-event channel)))) -;; is expr always a slot ? if true, we can specialize to ports -(deftype Incseq [peer expr] - IFn - (#?(:clj invoke :cljs -invoke) [_ step done] - (let [busy (enter peer)] - (deps expr run input-attach (peer-site peer)) - ;; TODO request - (exit peer busy) - ((->flow expr) step - #(let [busy (enter peer)] - (deps expr run input-detach (peer-site peer)) - ;; TODO request - (exit peer busy) - (done)))))) - -(defn incseq-expr [^Incseq incseq] - (.-expr incseq)) +(defn attach-deps [peer expr] + (let [busy (enter peer)] + (deps expr run input-attach (peer-site peer)) + (exit peer busy))) + +(defn detach-deps [peer expr] + (let [busy (enter peer)] + (deps expr run input-detach (peer-site peer)) + (exit peer busy))) (defn incseq [^Frame frame expr] - (->Incseq (frame-peer frame) expr)) + (let [peer (frame-peer frame)] + (m/sample {} + (m/observe + (fn [!] (! nil) + (attach-deps peer expr) + #(detach-deps peer expr))) + (->flow expr)))) (defn frame-result-slot [^Frame frame] (let [^objects nodes (.-nodes frame)] diff --git a/test/hyperfiddle/electric3_test.cljc b/test/hyperfiddle/electric3_test.cljc index c170c0b0..b1dafc4e 100644 --- a/test/hyperfiddle/electric3_test.cljc +++ b/test/hyperfiddle/electric3_test.cljc @@ -2386,11 +2386,11 @@ % := '[join 0 cancelling] % := '[join 0 cancelled] % := '[join 0 transferring] - % := '[join 0 terminating] - % := '[join 0 terminated] % := '[join 0 transferred Cancelled] % := '[join 0 cancelling] % := '[join 0 cancelled] + % := '[join 0 terminating] + % := '[join 0 terminated] (tap ::done), % := ::done))) (tests @@ -2414,11 +2414,11 @@ % := '[join 0 cancelling] % := '[join 0 cancelled] % := '[join 0 transferring] - % := '[join 0 terminating] - % := '[join 0 terminated] % := '[join 0 transferred Cancelled] % := '[join 0 cancelling] % := '[join 0 cancelled] + % := '[join 0 terminating] + % := '[join 0 terminated] (tap ::done), % := ::done))) ;; if we don't type hint the call to `fooBar` in the compiler the tests blow up on the inference warning.