From ef79c95b1d4046862d9b2d28d2681e55592b27a7 Mon Sep 17 00:00:00 2001 From: Peter Taoussanis Date: Sat, 21 Sep 2024 13:49:41 +0200 Subject: [PATCH] [v4] Add scan utils --- src/taoensso/carmine_v4.clj | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/taoensso/carmine_v4.clj b/src/taoensso/carmine_v4.clj index a348e00..9bbfcda 100644 --- a/src/taoensso/carmine_v4.clj +++ b/src/taoensso/carmine_v4.clj @@ -308,6 +308,51 @@ ;; TODO Try publish error message? )))))) +;;;; + +(defn reduce-scan + "For use with `scan`, `hscan`, `zscan`, etc. + Takes: + - (fn scan-fn [cursor]) -> next scan result + - (fn rf [acc scan-result]) -> next accumulator + + TODO Example" + [init scan-fn rf] + (loop [cursor "0" acc init] + (let [[next-cursor in] (scan-fn cursor)] + (if (= next-cursor "0") + (rf acc in) + (let [result (rf acc in)] + (if (reduced? result) + @result + (recur next-cursor result))))))) + +(comment + (reduce-scan [] + (fn scan-fn [cursor] (wcar {} (scan cursor))) + (fn rf [acc in] (into acc in)))) + +(defn reduce-kv-scan + "Like `reduce-scan` but: + - `rf` is (fn [acc k v]), as in `reduce-kv`. + - `rf` will never be called with the same key twice + (i.e. automatically de-duplicates elements). + + TODO Example" + [init scan-fn rf] + (let [keys-seen_ (volatile! (transient #{}))] + (reduce-scan init scan-fn + (fn wrapped-rf [acc kvs] + (enc/reduce-kvs + (fn [acc k v] + (if (contains? @keys-seen_ k) + acc + (do + (vswap! keys-seen_ conj! k) + (enc/convey-reduced (rf acc k v))))) + acc + kvs))))) + ;;;; Scratch ;; TODO For command docstrings