diff --git a/src/hyperfiddle/forms0.cljc b/src/hyperfiddle/cqrs0.cljc similarity index 65% rename from src/hyperfiddle/forms0.cljc rename to src/hyperfiddle/cqrs0.cljc index 3ac5bc719..a6b79c57e 100644 --- a/src/hyperfiddle/forms0.cljc +++ b/src/hyperfiddle/cqrs0.cljc @@ -1,6 +1,7 @@ -(ns hyperfiddle.forms0 - #?(:cljs (:require-macros hyperfiddle.forms0)) - (:require [contrib.str :refer [pprint-str]] +(ns hyperfiddle.cqrs0 + #?(:cljs (:require-macros hyperfiddle.cqrs0)) + (:require [contrib.data :refer [index-by]] + [contrib.str :refer [pprint-str]] [hyperfiddle.electric3 :as e] [hyperfiddle.electric-dom3 :as dom] [hyperfiddle.input-zoo0 :refer [Button!]])) @@ -47,4 +48,28 @@ (e/When debug (dom/pre (dom/props {:style {:min-height "4em"}}) - (dom/text (pprint-str batch :margin 80))))))))) \ No newline at end of file + (dom/text (pprint-str batch :margin 80))))))))) + +(e/defn Reconcile-records [stable-kf sort-key as bs] + (e/client + (let [as! (e/as-vec as) ; todo differential reconciliation + bs! (e/as-vec bs)] + (->> (merge + (index-by stable-kf as!) + (index-by stable-kf bs!)) + vals + (sort-by sort-key) + #_(drop (count bs!)) ; todo fix glitch + (e/diff-by stable-kf))))) + +(e/defn PendingController [kf sort-key edits xs] + (let [!pending (atom {}) ; [id -> prediction] + ps (val (e/diff-by key (e/watch !pending)))] + (e/for [[t xcmd predictions] edits] + (assert (= 1 (count predictions))) + (let [[id record] (first predictions)] + (prn 'pending-cmd xcmd) + (swap! !pending assoc id (assoc record ::pending true)) + (e/on-unmount #(swap! !pending dissoc id)) + (e/amb))) + (Reconcile-records kf sort-key xs ps))) \ No newline at end of file