Here's what I ended up with - minor variants of cond-> and cond->>

(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)))

(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)))

On Feb 12, 2014, at 2:34 PM, Sean Corfield <s...@corfield.org> wrote:

> On Feb 12, 2014, at 1:34 AM, Alex Baranosky <alexander.barano...@gmail.com> 
> wrote:
>> I wrote pred-cond for Midje way back, which does what you want. 
>> https://github.com/marick/Midje/blob/master/src/midje/clojure/core.clj#L176
> 
> That doesn't appear to thread each expression through the "results" so it 
> isn't really a variant of cond-> but between that and the source of cond-> I 
> suspect I will just end up rolling my own...



Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to