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: <[email protected]> on behalf of Jason Felice
Reply-To: <[email protected]>
Date: Friday, October 2, 2015 at 10:23 AM
To: <[email protected]>
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 <[email protected]> wrote:
>
>Alternatively you can do (cond-> {:x 1} (fn [x] (= (:x x) 1)) (assoc :x 2))
>
>On 2 Oct 2015, at 16:33, ru <[email protected]> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.