Dustin Getz / Sep 11 2022
missionary object lifecycle
{:deps {org.clojure/clojure {:mvn/version "1.11.1"} missionary/missionary {:mvn/version "b.27-SNAPSHOT"} com.hyperfiddle/rcf {:mvn/version "20220902-130636"} compliment/compliment {:mvn/version "0.3.9"}}}Extensible Data Notation
(require [hyperfiddle.rcf :as rcf :refer [tests ! % with]] [missionary.core :as m])(hyperfiddle.rcf/enable!)8.5s
(defn ConstantObject "build a continuous flow that emits a constant on construction, and then remains constant until cancelled" [x trace!] (->> (m/observe (fn constructor [emit!] (trace! ::mount) (emit! x) (fn destructor [] (trace! ::unmount)))) (m/relieve {}) (m/latest identity)))0.1s
(tests "object lifecycle" (def !x (atom 0)) (def <x (m/cp (let [x (m/?< (m/watch !x))] (if (even? x) ; object is destroyed when the if switches, and then recreated next time (m/?< (ConstantObject x !)) ::off)))) (def it (<x (! ::notify) (! ::terminate))) % := ::notify it := 0 % := ::mount (swap! !x inc) % := ::notify it := ::off % := ::unmount (swap! !x inc) % := ::notify it := 2 % := ::mount (it) % := ::notify it thrown? missionary.Cancelled % := ::unmount % := ::terminate)1.5s