We needed this functionality too and ended up writing our own utility macro:
(defmacro condp->
  "Takes an expression and a set of predicate/form pairs. Threads expr (via ->)
  through each form for which the corresponding predicate is true of expr.
  Note that, unlike cond branching, condp-> threading does not short circuit
  after the first true test expression."
  [expr & clauses]
  (assert (even? (count clauses)))
  (let [g (gensym)
        pstep (fn [[pred step]] `(if (~pred ~g) (-> ~g ~step) ~g))]
    `(let [~g ~expr
           ~@(interleave (repeat g) (map pstep (partition 2 clauses)))]
       ~g)))

So (condp-> {:x 1} #(= (:x %) 1) (assoc :x 2)) produces {:x 2} as desired.

We have a condp->> version as well.

Sean Corfield -- (904) 302-SEAN
An Architect's View -- http://corfield.org/

"If you're not annoying somebody, you're not really alive."
-- Margaret Atwood






From:  <clojure@googlegroups.com> on behalf of Jason Felice
Reply-To:  <clojure@googlegroups.com>
Date:  Friday, October 2, 2015 at 10:23 AM
To:  <clojure@googlegroups.com>
Subject:  Re: cond->: Using of threading expression in tests?


>This doesn't work, as (fn [x] (= (:x x) 1)) is never evaluated and the 
>function itself is always truthy.  (Same for the #(= (:x %) 1) version).
>
>On Fri, Oct 2, 2015 at 9:00 AM, Colin Yates <colin.ya...@gmail.com> wrote:
>
>Alternatively you can do (cond-> {:x 1} (fn [x] (= (:x x) 1)) (assoc :x 2))
>
>On 2 Oct 2015, at 16:33, ru <soro...@oogis.ru> wrote:
>
>Thank you, Colin.
>This works:
>
>user=> (as-> {:x 5} x1 (if (> (get x1 :x) 3) (assoc x1 :y 6) x1) (if (<= (get 
>x1 :x) 3) (assoc x1 :y 12) x1))
>{:y 6, :x 5}
>
>
>But without cond-> at all :( :)
>
>пятница, 2 октября 2015 г., 17:49:28 UTC+3 пользователь ru написал:
>Hi,
>Can I use in tests threading expression of cond->, and how?
>
>Thanx in advance,
>  Ru
>
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to