huge speedup to if-path by having specialized implementation separate from cond-path

This commit is contained in:
Nathan Marz 2016-06-04 15:01:28 -04:00
parent 59423c358e
commit ff2853381c
2 changed files with 29 additions and 3 deletions

View file

@ -528,9 +528,21 @@
(defpathedfn if-path (defpathedfn if-path
"Like cond-path, but with if semantics." "Like cond-path, but with if semantics."
([cond-p if-path] (cond-path cond-p if-path)) ([cond-p then-path]
([cond-p if-path else-path] (fixed-pathed-nav [late-cond cond-p
(cond-path cond-p if-path nil else-path))) late-then then-path]
(select* [this structure next-fn]
(i/if-select structure next-fn late-cond late-then STOP))
(transform* [this structure next-fn]
(i/if-transform structure next-fn late-cond late-then STOP))))
([cond-p then-path else-path]
(fixed-pathed-nav [late-cond cond-p
late-then then-path
late-else else-path]
(select* [this structure next-fn]
(i/if-select structure next-fn late-cond late-then late-else))
(transform* [this structure next-fn]
(i/if-transform structure next-fn late-cond late-then late-else)))))
(defpathedfn multi-path (defpathedfn multi-path
"A path that branches on multiple paths. For updates, "A path that branches on multiple paths. For updates,

View file

@ -709,6 +709,20 @@
res res
)))))) ))))))
(defn if-select [structure next-fn late-cond late-then late-else]
(let [apath (if (empty? (compiled-select* late-cond structure))
late-else
late-then)]
(doall (mapcat next-fn (compiled-select* apath structure)))
))
(defn if-transform [structure next-fn late-cond late-then late-else]
(let [apath (if (empty? (compiled-select* late-cond structure))
late-else
late-then)]
(compiled-transform* apath next-fn structure)
))
(defn filter-select [afn structure next-fn] (defn filter-select [afn structure next-fn]
(if (afn structure) (if (afn structure)
(next-fn structure))) (next-fn structure)))