Separate iterate-cursor and transduce-cursor

This commit is contained in:
arne 2025-11-22 00:10:31 +01:00
commit 97965ce8b0

View file

@ -131,6 +131,14 @@
(js/console.log :logging args) (js/console.log :logging args)
(apply f args))))) (apply f args)))))
(defn iterate-cursor [f cursor-req]
(.addEventListener cursor-req "success"
(fn [ev]
(if-let [cursor (-> ev .-target .-result)]
(do (f cursor)
(.continue cursor))
(f)))))
(defn transduce-cursor (defn transduce-cursor
"Allows to transduce over all values in a cursor. "Allows to transduce over all values in a cursor.
@ -148,18 +156,14 @@
xform (xform rf)] xform (xform rf)]
(js/Promise. (js/Promise.
(fn [resolve _] (fn [resolve _]
(.addEventListener cursor-req "success" (iterate-cursor (fn [cursor]
(fn [ev] (if cursor
(if-let [cursor (-> ev .-target .-result)] (let [step (xform @result (.-value cursor))]
; NOTE: each step will work with the raw js value (if (reduced? step)
; to avoid unnecessary conversion costs. (resolve @step)
(let [step (xform @result (.-value cursor))] (vreset! result step)))
(if (reduced? step) (resolve @result)))
(resolve @step) cursor-req))))))
(do
(vreset! result step)
(.continue cursor))))
(resolve @result)))))))))
(defn first-result (defn first-result
"Given a cursor, will return a promise that resolves to the first result. "Given a cursor, will return a promise that resolves to the first result.