From 1d3e7238857a59f111a0b1655f06f9ac29757c2e Mon Sep 17 00:00:00 2001 From: Michail Pevnev Date: Fri, 4 Mar 2022 12:40:25 +0300 Subject: [PATCH] Collect candidates eagerly `concat` produces a lazy sequence, which makes its repeated usage in a loop a potential stack overflow hazard (when the produced seq gets realized and has to recur over its subseqs). --- src/main/clojure/org/ajoberstar/jovial/engine.clj | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/clojure/org/ajoberstar/jovial/engine.clj b/src/main/clojure/org/ajoberstar/jovial/engine.clj index 65e98d8..23a0ffd 100644 --- a/src/main/clojure/org/ajoberstar/jovial/engine.clj +++ b/src/main/clojure/org/ajoberstar/jovial/engine.clj @@ -128,13 +128,7 @@ (defn select [^EngineDiscoveryRequest request ^UniqueId id] (let [listener (.getDiscoveryListener request) selectors (.getSelectorsByType request DiscoverySelector)] - (loop [result [] - head (first selectors) - tail (rest selectors)] - (let [candidates (try-select listener id head)] - (if (seq tail) - (recur (concat result candidates) (first tail) (rest tail)) - (concat result candidates)))))) + (reduce #(into %1 (try-select listener id %2)) [] selectors))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Discovery Descriptor Support