diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index a2f090d0..b905915b 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -65,17 +65,15 @@ (cond->> (->> (walk raw-routes opts) (map-data merge-data)) coerce (into [] (keep #(coerce % opts))))) -;; This whole function might be more efficient and easier to understand with transducers. (defn path-conflicting-routes [routes] - (some->> - (loop [[r & rest] routes, acc {}] - (if (seq rest) - (let [conflicting (set (keep #(if (impl/conflicting-routes? r %) %) rest))] - (recur rest (update acc r (fnil (comp set concat) #{}) conflicting))) - acc)) - (filter (comp seq second)) - (seq) - (into {}))) + (-> (into {} + (comp (map-indexed (fn [index route] + [route (into #{} + (filter #(impl/conflicting-routes? route %)) + (subvec routes (inc index)))])) + (filter (comp seq second))) + routes) + (not-empty))) (defn conflicting-paths [conflicts] (->> (for [[p pc] conflicts]